|
[size=13.3333px]一 三种类型的套接字:) \' a9 B+ i- a7 L8 |
1.流式套接字(SOCKET_STREAM)
) T. W' S$ J! @: G, b, u 提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。9 z! P' Q S" r
2.数据报式套接字(SOCKET_DGRAM)
9 I9 M% X+ A) a5 \: O( \8 \ 提供无连接的数据传输服务,不保证可靠性。
1 G( n& B/ a, I4 Z3.原始式套接字(SOCKET_RAW)0 W2 l; k; i* Z+ j& y' O6 H
该接口允许对较低层次协议,如IP,ICMP直接访问。& r; F5 z2 D9 h
1 A/ n$ Z1 p2 _8 z+ I1 D
二 基本套接字系统调有有如下一些:: T2 Y7 s3 ~: I) ], t2 ^! I6 k
创建套接字: socket()8 R: X& \* Y9 A' \: R8 |: u
绑定本机端口: bind()
, t. M3 E* m! ]; n+ ?) r 建立连接: connect(),accept()
5 r# P( P- F# J# t: m5 g1 c. t 侦听端口: listen()
- m p+ n" x. T0 h 数据传输: send(), recv()
+ D$ Q; y8 h) c; U! p 输入/输出多路复用: select()
, e. u$ M' _1 X( U5 n# p 关闭套接只: closesocket()
( h# ^3 y+ N) X5 B" G9 Q( R + m/ k; E# |/ v8 J% j+ E
三 数据类型
7 I& ~) g; _- D0 I0 t- C' J struct sockaddr- D; Z4 U; j4 w/ h9 {. A! u
{! B/ o3 i; z3 ^8 y" }8 w0 D
unsigned short sa_family; //地址族, 一般为AF_INET
( F6 R% p! f s9 q char sa_data[14]; //14字节的协议地址
: Q- \0 T! x8 [) `' l7 r }
' h) N9 d. b ?: F6 T9 ~9 K1 g" U' P9 a
struct sockaddr_in
: M' X+ L, `) K( a6 h; R {3 o4 ~8 v# m4 w; O; d* _! n
short int sin_family; //地址族
& f7 X9 M# O4 M5 B% N; f unsigned short int sin_port; //端口号
3 n) }- X7 j" X! R" _, Y! | struct in_addr in_addr; //ip地址( y4 H& u& h5 d/ }( X+ K" T
unsigned char sin_zero[8]; //填充
" y6 ]+ U7 T6 x5 @, a# {, C6 H }
; }( U7 m+ M/ ^* i& Z
: V8 k4 j. {: l, c; g" E四 常用函数# y3 `& B# ~4 C/ \7 `* T7 K3 z* Y# f
1 socket()
; ^2 z: L1 v0 h9 A0 e6 L @( _ 头文件: : v7 w. X1 U- N) D
#include <sys/types.h>+ k8 v- F: `# t8 i1 p$ D
#include <sys/socket.h>7 Y3 ]# {* U$ G; W; b" k" j
函数原型:
. A- R. l3 V$ [4 i5 _ M int socket(int domain, int type, int protocol)4 o8 W$ x+ L. F/ q( L$ y/ E
domain: 协议类型,一般为AF_INET
- s/ M8 f7 t+ _, p8 e( i2 s type: socket类型
; N! Z' m4 Q* I8 n" T) r protocol:用来指定socket所使用的传输协议编号,通常设为0即可1 P+ J9 d( S' c4 O! p
7 P8 E/ m: @+ d 2 bind()
& Q/ ?. L# \) c4 ` U+ S6 D 头文件:
) b" F; p4 C; W$ ^$ l #include <sys/types.h>
% }" l. |3 x7 |2 Z! ^3 c& O #include <sys/socket.h>0 t) Y, ~3 ]2 e% c! o! w5 w: S
函数原型:
! E( E& m4 b) p int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
* X9 Z: F3 {) p" _ ]9 q0 K y& Z sockfd: socket描述符
: V3 y- r0 I. _& f% F2 [% | my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针4 F/ ~, X- F1 \4 `) t. }
addrlen:常被设为sizeof(struct sockaddr)
- ? M0 B0 x3 F* S9 B ]$ K
* d$ f) c5 P% W( c! h5 ]1 Q 3 connect(), w4 J- B1 @4 ]& u8 R
头文件:& G: Z: f8 b& V% S0 a6 T
#include <sys/types.h> # J5 V+ P4 Z6 f6 }3 ~7 A
#include <sys/socket.h>
5 c/ p2 Y5 }9 [* K 函数原型:& _6 [" ]/ B/ O1 J/ A
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
1 b* j4 _7 `# t sockfd: 目的服务器的socket描述符1 ~3 \" D; G. a0 w/ |6 h
serv_addr:包含目的机器ip地址和端口号的指针* |& u: |1 O, D/ c$ i' k
addrlen:sizeof(struct sockaddr)
* k1 Z" A$ C6 l6 O2 }2 R u+ g3 ^3 p- H( I! A
4 listen()
3 E4 j* p. y9 W x% b g 头文件:
- {4 l* I' ^9 e- ^ #include <sys/socket.h>
8 o8 k8 P+ g. Y 函数原型:( G+ J7 v! B7 ~
int listen(int sockfd, int backlog);
C4 ^0 f" G& ~1 P% o& V sockfd:socket()系统调用返回的socket描述符
3 F1 p& s/ q% L* p" r backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。1 j2 i' v3 v4 s& P
/ n' G" R- I) o, H1 u, M: P- { 5 accept()
% M; O2 r+ i0 _1 | 头文件: ' ~. r0 ~+ Y0 g' C4 A- |3 R2 Z3 N
#include <sys/types.h>5 m, d6 L' _+ u6 R6 @2 Q' ^
#inlcude <sys/socket.h>
' ~ n) \ i+ e% _0 E, \5 | 函数原型:
. W& c4 G" X N" A5 s% ? int accept(int sockfd, void *addr, int addrlen)+ h4 L3 `: d9 h$ b& O- q7 q$ F6 b
sockfd:是被监听的socket描述符1 c6 Y$ N4 [3 F" s7 K* H2 F1 j9 t
addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息+ | Y! s- O5 {4 X) Q- t8 V
addrlen:sizeof(struct sockaddr_in)5 i) C4 i( O5 `$ U l
! j) A7 |& C5 D& X* _9 e 6 send()
5 I2 r4 u8 F& K 头文件:
' [/ c2 W9 E: [# o- s #include <sys/socket.h>
2 x p( n/ q5 a4 ^ 函数原型:! C7 Y+ Z, K6 J3 ^9 Y
int send(int sockfd, const void *msg, int len, int flags);
0 o m* D- b6 b, @) D5 n: H sockfd:用来传输数据的socket描述符+ |1 `& |! P* f5 C
msg:要发送数据的指针 3 ?1 ^2 [6 G' J* _& R' n
flags: 0. d2 X; I; @" |
9 o# g" f: B0 u; `% F) A
7 recv()
?& r n% K( f0 V. u2 Y7 E 头文件:
; k4 }( [! u \. X #include <sys/types.h>: W5 K- |5 I- X; A
#include <sys/socket.h>
, x ?# J+ |3 a, H9 l1 F$ h0 [ 函数原型:$ N/ M% u6 x# G8 @) g1 w
int recv(int sockfd, void *buf, int len, unsigned int flags)) k, V/ @8 e# q5 C0 M5 V6 v
sockfd:接收数据的socket描述符: O# {; q% ?5 T0 l/ X5 E% z U; d
buf:存放数据的缓冲区
- q0 E: X+ F* b1 w len:缓冲的长度8 I- j/ c |( F% C( |. l
flags:0
2 [0 j- V" V$ H5 g8 \
2 _4 O- D1 ~& D$ V5 z 8 sendto()
' [6 x/ {$ N) T4 e( r% r0 S 头文件:
% L' T" Y. [. i9 g2 `6 s #include <sys/types.h>, |% B4 M: N. L6 b9 U0 k; p& h
#include <sys/socket.h>
/ U' U. L' y1 H0 |! @7 U [5 G 函数原型:
2 }1 ~ i. A+ ^" k8 P7 j int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
* O$ w0 j9 D; t- G: F+ q* y+ @! `! Y
; \8 L5 u: }1 o 7 A% ]) p( N! ], I5 X& p: ?2 o9 u
9 recvfrom()' D) }, [5 I6 ^. H- R' S, C# r
头文件:& D3 x2 \1 q! H3 i ^0 e* W
#include <sys/types.h>( o+ y' M( U9 S# R# j F. I1 Z/ E
#include <sys/socket.h>3 {! o9 {$ \) T- X9 o' e
函数原型: K, z' T! F: k: t: l$ i6 U- _
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
3 l- O' z% @ D3 [9 B7 E
8 H9 g. x3 m e, K6 A6 K
, \" j, z9 |& S6 Q. T. J/ Z! }4 }: D9 E 10 read() write()* C! k9 y. N2 f* k& M; h5 b
int read(int fd, char *buf, int len)
+ i7 o" z, q; g& A" K% H1 R int write(int fd, char *buf, int len)
6 f7 p" m* p$ ^. W% I& @ 7 O7 q6 l5 j+ n; A# N s+ y
11 shutdown()* `4 a$ {1 M5 A, F6 R1 L; a/ n. X
close(sockfd)9 y \$ Y/ b) D1 Z' \% ]5 u
int shutdown(int sockfd, int how), S7 s: m D% k/ Y8 h+ j
----------------------------------- [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等)
' u6 h: _% ~, U/ W& O# H<sys/socket.h> //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
" V' a- i3 N: R" L<sys/ioctl.h> //I/O控制操作相关的函数声明,如ioctl()) s! }9 W- n9 Y% N G5 o
<stdlib.h> //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
! b* `: k" _0 ]2 C* X& u% E0 W<netdb.h> //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等- N# q. C) m N
<arpa/inet.h> //某些函数声明,如inet_ntop()、inet_ntoa()等/ U t/ T. X- z" z
<netinet/in.h> //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等 [size=13.3333px]------------------------------ [size=13.3333px]linux下socket编写常用头文件7 U; Y! I2 g. ~/ W) Q
" _) h: E+ o: D& V, X1 @* `# Z
[size=13.3333px]#include <sys/socket.h> //connect,send,recv,setsockopt等6 p$ S9 n( L4 {) Y5 U
#include <sys/types.h> $ A6 E& k: i! Q5 t; U, ~
7 J5 k% B% G/ `6 X
#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons
6 O9 S' Y# k' W1 E#include <poll.h> //poll,pollfd
t! T2 p7 C/ U3 I4 o3 a0 ?$ o5 s1 M#include <arpa/inet.h> //inet_addr,inet_aton
9 e' Q7 \! ?. H$ x5 ^' G; J#include <unistd.h> //read,write
- T! O; Y$ K% M) R" i6 k#include <netdb.h> //gethostbyname
7 I8 I/ s; N' R5 R3 X: C
* a2 u) W7 P* r/ w#include <error.h> //perror. \) g' K# G2 W; p
#include <stdio.h>
# m; @& {4 C" A: n7 a5 C. k#include <errno.h> //errno
_; E$ f6 ]) G, d) g$ D/ {5 R. K5 K1 |6 T7 a5 k5 K
#include <string.h> // memset
) I$ a6 z6 f) `. u9 M- j/ [#include <string>1 t/ t6 c& M! L+ M, t. Z
#include <iostream>
& _: S& y% I+ K9 U9 y& s# Q9 h. A( l/ N9 o1 L0 J/ I- \
|