cncml手绘网
标题: socket编程需要哪些头文件 [打印本页]
作者: admin 时间: 2020-5-8 23:01
标题: socket编程需要哪些头文件
[size=13.3333px]一 三种类型的套接字:
& h& {9 D% p. C8 Y( Z3 `& ]3 t1.流式套接字(SOCKET_STREAM)2 R! Y! k6 N7 I
提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。 [5 S0 f. {5 j( z3 d. I& y) L
2.数据报式套接字(SOCKET_DGRAM)5 t3 \5 v2 A- E# T0 R4 U
提供无连接的数据传输服务,不保证可靠性。* c0 M! [4 N# p/ ^: y
3.原始式套接字(SOCKET_RAW)/ m7 q7 I: s. t% |8 d- Q/ v. m. U
该接口允许对较低层次协议,如IP,ICMP直接访问。1 K) E" T+ \& _6 O
2 j6 I% R% d( Z& |
二 基本套接字系统调有有如下一些:% ~+ L Y) `) `# ` z+ `) C+ m
创建套接字: socket()
2 ~5 O6 G- I2 ] 绑定本机端口: bind(), M; v$ S0 U; V" H" v3 a% R. o
建立连接: connect(),accept()
" I6 }* M5 ^7 ?, ?( t1 Z, ~ 侦听端口: listen()- ^4 K# g W+ Y0 z
数据传输: send(), recv(); {; V; `! `1 @' f. d9 o# U
输入/输出多路复用: select(). N* t1 r Z7 n7 B" x. m% z
关闭套接只: closesocket(). e" C' h7 n" ~- ~ s1 _
2 b1 A0 s3 x4 `; Q* J! o a% u三 数据类型1 I5 Z* f7 q7 K5 Y
struct sockaddr% {. R; x* Z. n9 X5 e
{
, o% H5 P/ {! [" K6 q unsigned short sa_family; //地址族, 一般为AF_INET8 w8 e9 S& V7 Z8 D9 e1 [- }
char sa_data[14]; //14字节的协议地址
* L1 U2 X4 t. F }3 g) X, i! ~- @5 O& K
F3 C" Z& l8 Z, T7 _5 ?# X" E struct sockaddr_in
. e3 n$ D |" i+ Y' K {
8 C) B5 u# h+ r6 ? short int sin_family; //地址族7 K% d" _1 ~$ T- r% U" c2 D
unsigned short int sin_port; //端口号
& ^) ^# t. J0 K! |. F struct in_addr in_addr; //ip地址
4 w" }/ d. l4 R7 K unsigned char sin_zero[8]; //填充
: g2 H" w3 @4 e* R$ n/ b } Q7 _/ d' e( \% o9 l
1 Z: |# ~: ~- _( L3 y四 常用函数
Z: w% S7 m V! T0 x0 g0 H 1 socket(), r/ c( {& ~/ J M2 ?0 E
头文件: ! ?1 ]) ?& e4 w2 J2 `! r* ]5 O
#include <sys/types.h> N8 K/ Y) x! _; p; n9 f9 }
#include <sys/socket.h>
5 l' r# l# s9 X2 A, X3 z2 K; a 函数原型:. s8 Q) `1 \8 K7 u) h
int socket(int domain, int type, int protocol)! K' P( {* r( i& ^( N* ?
domain: 协议类型,一般为AF_INET
3 w! h( s6 i. H5 S% | type: socket类型
! _% U8 K, j2 l. x) }( W: V- p t protocol:用来指定socket所使用的传输协议编号,通常设为0即可: k! O& @- r( d+ x! \. v
% |. {$ L0 E: O+ I. d7 q4 l 2 bind()
2 x! F$ q: V6 Q( Q( o8 u& i 头文件:+ |% |& d* v6 G3 u8 y
#include <sys/types.h>
2 g' w" h9 J( _( O) R# | #include <sys/socket.h>
/ i0 k* A7 e2 [9 a0 ?/ V) W 函数原型:$ H/ ?/ ~0 h7 R% }0 e
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
5 C: p& p* K2 X7 } sockfd: socket描述符
" n. S' v+ v! [ i my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
* B( P* [; g. n: `9 C2 G2 I addrlen:常被设为sizeof(struct sockaddr)- Y7 Y% T4 a' }% j
& b, [) @6 s' f6 a, P 3 connect()
7 M" |* G& P! u9 d6 P0 a 头文件:
5 ~9 _ {' C3 [ #include <sys/types.h>
/ k' z& _4 r! P" A #include <sys/socket.h>2 {+ }" ^4 Q! s! d! R& `9 l) w( D! J
函数原型:
$ u. k% K/ F) u* H int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
$ Z4 b( j# v8 C1 d" V+ k sockfd: 目的服务器的socket描述符
. `5 M; g$ K3 |; c3 F; ?4 | serv_addr:包含目的机器ip地址和端口号的指针
0 Y# B& \" b5 C) q# {! C$ v4 Y addrlen:sizeof(struct sockaddr)
) Q. A0 g7 J; w+ z4 p7 A1 u
+ k8 a2 w0 i2 c5 j; r" I, {; i0 e/ m 4 listen()
5 w6 c+ q ~8 m1 Q- o1 I 头文件:
3 U) B9 `: F9 j8 [ #include <sys/socket.h>0 G( n8 N) S _, A
函数原型:
: K8 s2 K; p" M int listen(int sockfd, int backlog);
9 G! @/ t1 L7 ]& ]; [ K sockfd:socket()系统调用返回的socket描述符! A# f- k/ d9 Z* |
backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。6 v. |% m/ N7 l) _" }/ k
- u9 F' Q$ [, @" w% |. K+ m
5 accept()# {4 a1 _$ I" N# N: H
头文件: * s. X& w$ S0 j3 j& I
#include <sys/types.h>
* X h& `+ k6 i. z" v( h/ n #inlcude <sys/socket.h>. ]! u& o$ q* Q) r# K
函数原型:4 e0 |8 k7 g% u" O' G: J
int accept(int sockfd, void *addr, int addrlen)
h8 W( b- E- }9 g$ R/ W' E sockfd:是被监听的socket描述符5 i) I% j( X" ?. M
addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
7 B, s( L* f4 m u2 M addrlen:sizeof(struct sockaddr_in)
* _6 p5 p: L& Y T; k : G, N/ t# I' L7 `9 N
6 send()2 M+ v( B/ Y+ y3 d3 h- h
头文件:
# D, N. @0 P' v& n #include <sys/socket.h>; h2 g: W1 i7 ?0 P8 f# M$ j/ j
函数原型:: |( o# I: w* |) N9 `4 j7 b
int send(int sockfd, const void *msg, int len, int flags);
9 k$ Q* a( U) O3 `+ P" P6 ? sockfd:用来传输数据的socket描述符: k( U5 l( {2 k+ E1 s
msg:要发送数据的指针
" b+ G+ p& ]& Z flags: 0
! G- b! _8 S) t! z7 K4 b' U, h , P2 r2 s8 S! O$ ^% c; a2 x
7 recv()
4 B" f5 E; h& ?( m6 T 头文件:
8 t0 A, F& {: o/ h" }, _6 x #include <sys/types.h>
$ S- d1 C6 w* ~ f8 R# C #include <sys/socket.h>
) ^& e# b. |! f8 w* `$ ~, L2 P 函数原型:
( |$ f2 s2 V( Z1 ?4 Q" P! F* T1 {1 Y int recv(int sockfd, void *buf, int len, unsigned int flags)
& m! W; C2 [/ x; q3 K sockfd:接收数据的socket描述符
0 G9 q3 }/ b9 C& n* l5 b1 b# o buf:存放数据的缓冲区
! d/ r8 k0 N W0 Z- @ h len:缓冲的长度7 a$ F S4 q$ v; y M9 R2 k1 ~
flags:0
2 H: q4 c! x. P$ _& g* j; Z# T- [; ]3 F( H I, B" M
8 sendto()) [, G& Q) B" Z W6 \$ c
头文件:
/ y1 w9 V7 f1 e #include <sys/types.h> J! Q% S) m: b% y+ A v! m8 ^
#include <sys/socket.h>
3 }4 D6 n" B5 B" f3 a8 m3 N 函数原型:1 d5 c* F" ^" ^, i
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);- P2 I/ D* B% \ a8 F8 t
- P& a7 e) g" I3 b2 @) m / ~/ A* F+ G* @* k6 [- F$ ]
9 recvfrom()5 e" x$ ?) g, g+ ?5 n3 R
头文件:
B& i- P, t; X& E #include <sys/types.h>
+ ]/ J) V! _: `* n #include <sys/socket.h>
5 U- b$ H* Q. B0 B8 P: { 函数原型:
' h' \* L8 e% ~ int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
5 |+ K3 C8 H7 }* T2 p
2 X _: x% n/ d' i ' X) r# l. i# r, F5 c2 Y2 h
10 read() write()
7 D7 Y& J9 a4 u. A4 I int read(int fd, char *buf, int len)# G: B1 L, K+ W
int write(int fd, char *buf, int len)) y6 a9 ], o& \* Q! e
! ^- _4 x: c5 c( V, @# D 11 shutdown()) L: ?$ F4 S& b5 T7 D7 L/ \: G; K
close(sockfd)+ z& U- I+ n' ^5 N$ U" C
int shutdown(int sockfd, int how); s; ]; G# b& U" Y! U2 ~8 E6 k1 I7 E
-----------------------------------
[size=13.3333px]netinet/if_ether.h ether_arp的数据结构
[size=13.3333px]netinet/ether.h 以太祯的网络字节和ascii字节的转换,包括ether_ntoa(),ether_aton这样的函数定义
[size=13.3333px]netinet/ip.h 这个头文件和linux/ip.h似乎很相似,也有iphdr的数据结构,同时还包括了timestamp结构,我的理解是,linux文件夹下的 ip.h是linux黑客编写的ip头文件,而这个则是gnu一开始就定义的头文件,同时还包括了bsd中的ipheader结构定义。同理的还有该目录 下的tcp.h等文件
[size=13.3333px]linux/ip.h iphdr的数据结构,以及一些ip层的数据定义,同理的还有tcp.h,udp.h等等
[size=13.3333px]linux/if.h 主要的socket头文件,似乎修改自unix的if.h,定义了网卡的接口信息的宏,例如IFF_UP.另外有数个重要的interface的数据结构定义,包括ifreq,ifconf,ifmap
[size=13.3333px]linux/if_packet.h 原始数据包的数据结构定义,包括sockaddr_pkt,sockaddr_ll,想接收原始数据包的不能错过这个文件。同理的还有if_ppp.h,if_tun.h等等
[size=13.3333px]netinet/in.h 这个文件作的事情就多了。端口宏定义,著名ip(比如loopback),结构sockaddr_in,网络字节转换(ntoh,hton。。。。)。。。反正太多了,没事的话就把这个文件加到头文件包含里吧
[size=13.3333px]netdb.h 文件如其名,包括结构hostent(主机环境),获得主机的信息的几个函数(gethostbyname)。似乎这个就是定义主机的各项环境,例如hostname等等
[size=13.3333px]net/bpf.h berkeley的数据包过滤头文件,想用bpf进行包过滤的要重视一下这个文件
[size=13.3333px]net/ethernet.h 包括几个以太网的数据结构,ether_addr(mac帧结构),ether_header(以太帧的头部)
[size=13.3333px]-------------------------------
[size=13.3333px]<sys/types.h> //primitive system data types(包含很多类型重定义,如pid_t、int8_t等)
, \9 ?$ x) T# O+ F+ w3 u<sys/socket.h> //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等. T" m/ T! ?/ d% W% i
<sys/ioctl.h> //I/O控制操作相关的函数声明,如ioctl()* k4 Z2 _4 o* k6 j+ t& f
<stdlib.h> //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等& B% k. D0 A0 `; Y/ O; `# F3 ]
<netdb.h> //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等 U1 _% h( ]3 e5 V0 m4 s
<arpa/inet.h> //某些函数声明,如inet_ntop()、inet_ntoa()等
5 {6 P. f4 r6 s/ ]. ?2 Z<netinet/in.h> //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
; q/ a X) g+ z' [+ Q& j; }. W, Q. ~# U: a: J
[size=13.3333px]#include <sys/socket.h> //connect,send,recv,setsockopt等$ Q9 M( l6 w* w; ^) B
#include <sys/types.h> . {/ t6 s1 T, l3 f. {9 s: a
* m5 n9 `/ h: Z) ?. C* o
#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons
$ }, @4 L& M* a z5 l: x) ^#include <poll.h> //poll,pollfd2 X e' L/ P( o
#include <arpa/inet.h> //inet_addr,inet_aton6 L: Z0 a, G& Y, \
#include <unistd.h> //read,write4 a! X' T% ?. W2 P+ H
#include <netdb.h> //gethostbyname$ B/ j, ^( |6 N7 k, ^3 K" J
1 c z+ I0 p) D1 m' }#include <error.h> //perror5 X) @- C$ q- N, B7 `9 E" r
#include <stdio.h>
9 M: y6 w% m( G r: {* P- V#include <errno.h> //errno
" k9 n! \9 C. l* g& C5 k! j2 @. {
#include <string.h> // memset$ f9 I2 D% U, H! R
#include <string>$ g0 o t6 u; V2 A
#include <iostream>8 V8 |& i8 j. P# q( B
' u7 Q W h5 B/ V; l% b' Y8 U
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |