|
[size=13.3333px]一 三种类型的套接字:; k7 f$ `4 |) u8 y
1.流式套接字(SOCKET_STREAM)
& j6 } G# d- h6 ~7 N( Q8 ]; ` 提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。
% \& W" u3 X; H: m# B2.数据报式套接字(SOCKET_DGRAM)8 g" J+ M3 c& b) O- l+ p
提供无连接的数据传输服务,不保证可靠性。
. p- t2 i8 q- R8 K+ g: U3.原始式套接字(SOCKET_RAW)) P8 x8 }1 w5 }4 b' S9 ^
该接口允许对较低层次协议,如IP,ICMP直接访问。, D3 l* j" E, }7 `9 d: \% K
( X: Y" E5 l. M W* h0 W二 基本套接字系统调有有如下一些:
3 J6 ]1 C: {5 s 创建套接字: socket(). [* D e- z9 b- _0 Y
绑定本机端口: bind()
' X2 @1 x+ R0 @ 建立连接: connect(),accept()
# T* q9 \. U* a( U' P1 C 侦听端口: listen(), [, O1 h& z1 h' i
数据传输: send(), recv()
( a& O. s6 R7 i f+ D) a7 s 输入/输出多路复用: select()
$ p1 F. {" P/ D& g- f* w 关闭套接只: closesocket()
8 x; U/ K9 S! @6 M7 l ! ]- t: V* j4 ^5 u
三 数据类型% K; z# c1 U" [8 o4 ^2 R9 V
struct sockaddr
# B# X7 A- p$ h X! @$ z {8 P$ l+ _1 P: P8 ?& G% D; w
unsigned short sa_family; //地址族, 一般为AF_INET& U; Z' P. K. k8 A# S; z
char sa_data[14]; //14字节的协议地址. Y+ @5 Y& f9 L% w! B O3 X% @/ Q
}! ]0 v* ]! V. I% r
0 H! _& N- @: ~# _) z7 m& I* G1 A0 } struct sockaddr_in
- V( d2 y& Z6 z# B {" n L% h+ N; N# Y: M& k; k3 A4 V
short int sin_family; //地址族" T- W, l/ o7 G
unsigned short int sin_port; //端口号
. p- t; D8 E/ w1 B- ` struct in_addr in_addr; //ip地址" o" y; R9 E7 ~1 f0 G
unsigned char sin_zero[8]; //填充2 E p9 C4 j0 K- z% U, g; ]
}
1 i% o7 }6 ~/ K; N1 R. @
5 D: C; |3 b* I& K6 Z: E四 常用函数5 ~! j9 u# n3 S* w; U
1 socket()7 y: N+ P0 M$ d4 u4 y) P5 M' D% M* b+ e9 i
头文件: 4 J% v6 E5 a7 _- ]
#include <sys/types.h>
5 w& @ e% Y+ p- |! A1 C. S) Q #include <sys/socket.h>' r, i5 [# P/ f% o/ S
函数原型:
1 O( H+ P7 X8 K int socket(int domain, int type, int protocol)
0 `5 B' y: Q$ F: b# y0 i9 { domain: 协议类型,一般为AF_INET
3 D" ?, O" U+ N! L type: socket类型
4 w5 s. y) _ W5 a8 x0 J3 v8 }& e- i protocol:用来指定socket所使用的传输协议编号,通常设为0即可
9 m0 ?( a1 [+ p. |$ e/ W) c7 ~) J% p* X* G
2 bind()# D6 l8 {8 V, v4 U2 O' c% F1 x9 O
头文件:
; a! r3 J( }4 _! M8 s #include <sys/types.h>
9 x5 A7 G$ V2 k1 q% d' i% g' ^ #include <sys/socket.h>
2 T; R1 e7 G% F; b. j6 z 函数原型:- I" c# k4 O' O. ^1 Y1 K' v
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
8 i2 s# l' t! s& p) q: ? sockfd: socket描述符0 m1 s% ]& j* ?# D" [& S4 r
my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
: c7 i) [) S5 K$ a' d; X addrlen:常被设为sizeof(struct sockaddr)
( t; p2 M) z- {7 c( t
9 X% x: J+ ~# S/ p8 K 3 connect()" Z, D1 h+ f8 t9 R7 S
头文件:
. d8 v3 F' n4 q! n1 V #include <sys/types.h>
. U9 N2 m; D9 l9 B; `2 d' @% n6 u #include <sys/socket.h>
1 x6 |$ ]; U+ M5 r 函数原型:
# G+ \. y0 q9 y) c% |, c int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
! J( v2 _3 x: V; Y( V% ^8 u2 F sockfd: 目的服务器的socket描述符
j3 _: n, M) Z, d9 P serv_addr:包含目的机器ip地址和端口号的指针; r& K' q0 q, _5 I* u0 N
addrlen:sizeof(struct sockaddr)
* @0 d8 }" o9 a) V- O0 k9 A1 S6 }3 ~; w
% E( V& i( V4 T* d0 H 4 listen()
" W! u% K8 q1 ]) x 头文件:
: |. `' d9 |7 P! s/ L #include <sys/socket.h>
1 J7 l3 o: x; M( S0 H: S 函数原型:+ F& \2 n0 q+ I+ Y' ` Y; K# _
int listen(int sockfd, int backlog);4 z' L; S) W: V& b/ }" v6 W$ H
sockfd:socket()系统调用返回的socket描述符* l2 l. k3 H" n& D4 v- |
backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。" k; V N' f m6 p8 [
* g. p$ o( [3 i, b! p4 s 5 accept()) Q! l" `, J" e8 n5 T1 x
头文件: + W! v/ Z% V* X9 i9 n1 D
#include <sys/types.h>
: ~! T: g, |3 [, i' \# F #inlcude <sys/socket.h>
+ B6 y, R+ F$ e0 j1 f; I 函数原型:
" [' ^! |" u1 _9 M) i+ B8 J) k int accept(int sockfd, void *addr, int addrlen): \$ j3 k' Y0 D, Q8 Y/ b; Z
sockfd:是被监听的socket描述符
& D) [, u, O% O* ^8 o3 G" c$ j addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息9 F2 c7 P6 s! N+ G4 K$ I' Q" L
addrlen:sizeof(struct sockaddr_in)
3 h8 R l0 Z- q% r7 Q* g- }, T2 i; Q
! q! W, o5 {% s- ^ 6 send()) v+ y8 X% e2 N4 ~, b: X% t+ C0 h
头文件:$ I' {% F4 P. Q) B: W; X! ?
#include <sys/socket.h>% ?3 o; U, T- p% m
函数原型:2 O* s, v$ C: b
int send(int sockfd, const void *msg, int len, int flags);
0 Y7 x& A5 p1 B, ?* U sockfd:用来传输数据的socket描述符
! M% X- ^2 d- m% Z4 K, a" ] msg:要发送数据的指针 9 f' [- ^1 o D. j& P: o, M% b
flags: 0
+ q! B2 W3 C3 h. s# D2 [ 8 s6 N9 l" Z2 G0 F5 }+ l
7 recv()
1 S7 T- W+ X9 K7 T: g 头文件:
: X) ~5 [- o/ p* |9 z" K #include <sys/types.h>
& A/ d9 R1 R4 t1 m* a9 _ #include <sys/socket.h>
[9 }& P2 i0 v# R& Q$ V8 P 函数原型:
3 s5 L r9 i$ O) x# h+ r! f" Q( S0 z int recv(int sockfd, void *buf, int len, unsigned int flags). n) D6 T# D( y. m. g; h3 k8 s2 y
sockfd:接收数据的socket描述符
& a! r) T% C }8 v0 s' c buf:存放数据的缓冲区
4 R8 { Q, \4 ? len:缓冲的长度
/ n' F; q4 ?: t" \8 k" m5 u$ ? flags:0! b8 X% P8 x A
7 o2 U) ]7 s4 b! _ 8 sendto()
" G. c$ I+ n. Y+ q 头文件:% k/ ]- P+ q3 r+ P6 O
#include <sys/types.h>
5 C [4 ]) O" E5 \4 \3 {$ A. | #include <sys/socket.h>) f6 R" y: B& [$ c1 @
函数原型:
7 D/ r2 \0 p& W5 W/ w6 s0 R9 {! W int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);$ W. w. m- w- m' H2 }2 y- ]
7 \; p7 J# o0 h' \( L & F: d3 g3 n I {1 z
9 recvfrom()
" n+ p# M' \" f' c8 {1 W( l# [ 头文件:
: _$ g2 Z6 V# }, O. ] #include <sys/types.h>7 g+ C+ o' ~" t$ x; A$ ~6 K
#include <sys/socket.h>
1 P+ d# c9 ]% t' S/ y0 S Y5 q 函数原型: {+ q5 y6 S- \7 g/ ^
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen): @( n0 e- F% s3 {( O
" j8 r8 F5 N3 \: u: p
7 A, g8 M/ S/ ?/ O' T# Z 10 read() write()
- ~5 I" W( {3 ^. t# F& u5 `* Y3 q int read(int fd, char *buf, int len)) {5 \' q ~$ Y
int write(int fd, char *buf, int len)" t3 C/ _- d- Q, _& w+ t+ C
5 Y# ^4 h5 ]5 E/ \- r
11 shutdown()
# \0 u# P; p/ H5 ?6 C% G* f close(sockfd)! c' C& c% u9 H9 @9 @# ~# x' @
int shutdown(int sockfd, int how)
2 F$ G9 _1 j; w5 F9 A7 E9 M- O& U----------------------------------- [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等)
$ i" ~" O0 B' Z7 q' k<sys/socket.h> //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
: {$ D/ o7 X5 c9 t<sys/ioctl.h> //I/O控制操作相关的函数声明,如ioctl()
; U5 B v% L( C+ c' t& k/ l- E<stdlib.h> //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等 k' D e9 F8 g* ~3 ]6 c9 {$ N& h
<netdb.h> //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等
0 R/ W7 v& Q8 x* ^" {& J; {<arpa/inet.h> //某些函数声明,如inet_ntop()、inet_ntoa()等
8 s$ Z$ N$ l" ?' A<netinet/in.h> //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等 [size=13.3333px]------------------------------ [size=13.3333px]linux下socket编写常用头文件
- d6 K7 S$ V6 J! ?% f: C1 D% G2 v; ~: b8 O L! h8 Q
[size=13.3333px]#include <sys/socket.h> //connect,send,recv,setsockopt等
; f! g8 ~5 c7 D8 d#include <sys/types.h>
0 c/ d+ m; _" w+ ]/ {9 U- j
1 O+ e* [, h y9 `0 q5 h9 N#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons
: @/ |( d: z9 w4 z' {+ E#include <poll.h> //poll,pollfd
, d! n( V0 |1 a0 k5 a6 D7 V#include <arpa/inet.h> //inet_addr,inet_aton1 w% Y, f# f. \% E! Z/ n% Y# D I
#include <unistd.h> //read,write( i! M- v5 ?2 k4 b$ [
#include <netdb.h> //gethostbyname! ] a5 ~! K6 E6 L1 N
0 W: o; ~( ?2 ]# n7 s% S, w/ Z#include <error.h> //perror0 O" {" a7 x! v8 ]+ _4 h
#include <stdio.h>6 f& i+ Y [1 G0 B
#include <errno.h> //errno
0 _4 [* e- t4 V* @1 N1 K8 ?* @/ ^. S8 u" g: E
#include <string.h> // memset# W0 c1 }4 R' j9 R
#include <string>( r4 h: h( h: ^
#include <iostream>
2 _! \1 q; c6 k( u2 m" j0 c& g
/ m! w7 K8 A/ Y' ~4 E |