[size=13.3333px]一 三种类型的套接字:- j, e/ ^8 z: u! m& {( I( X
1.流式套接字(SOCKET_STREAM)% K7 C J6 `7 T5 x/ V9 u8 P6 ]
提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。" t o# z0 C$ q% ?. k/ O* `, {
2.数据报式套接字(SOCKET_DGRAM)
& Y4 ]+ ^" w; F- y& r C& T 提供无连接的数据传输服务,不保证可靠性。
( a. C/ e; c5 K- n3.原始式套接字(SOCKET_RAW)# t V' w% N1 x" a& X8 J
该接口允许对较低层次协议,如IP,ICMP直接访问。/ j- [ \* V8 y1 r# K
/ D5 c& A+ C% v二 基本套接字系统调有有如下一些:
- x+ w: |5 i `1 [7 l, @$ B 创建套接字: socket()# s8 [8 K* T o" J
绑定本机端口: bind()! A: @" p: _; s% H/ {2 n& {
建立连接: connect(),accept() }9 b* M( V0 F5 C, @
侦听端口: listen()
$ u' G! n k# C) ^2 i1 p4 m ? 数据传输: send(), recv(); y6 @+ B+ A1 \- i
输入/输出多路复用: select()
4 _2 p# T! ^" @, q1 _ 关闭套接只: closesocket()
/ J6 e. Y- h) t) F0 {$ i
. x4 q7 M+ R- i6 c, h三 数据类型. _& L6 g) t3 R8 G8 k
struct sockaddr- v* u# Z2 o0 C5 s9 C+ y
{
. s% `! b$ b# J$ h. C: t unsigned short sa_family; //地址族, 一般为AF_INET/ i+ K' P- ^+ B9 d
char sa_data[14]; //14字节的协议地址3 V4 l7 H7 b0 @* ?2 z/ {& r( @
}
: u; Q# C2 i- \$ T5 m0 p! b
- t6 T3 D/ g+ ~; J7 X struct sockaddr_in
' \5 a/ J6 V! L" i: E: Q6 V1 t {7 ~* n# |2 R; q2 L- J: R6 p
short int sin_family; //地址族3 f2 J/ O% @( _% L- G- L
unsigned short int sin_port; //端口号
1 P+ K- Q9 a% r! i E; D struct in_addr in_addr; //ip地址/ z4 K7 p1 R2 i" @7 e
unsigned char sin_zero[8]; //填充# A1 l1 C2 [( p2 @. f
}, d! ]9 a) p5 M' O" R
, u: V, Q x' C6 O7 `* U四 常用函数
( y# Y0 ^, u) G+ l* j1 y9 ^( U 1 socket()
3 l- U5 S: z. y 头文件:
& d7 `$ V f3 b: O# f. h) V #include <sys/types.h>
. E8 M# a) x5 u6 C9 [ #include <sys/socket.h>
- i% P5 p+ S6 L8 {- a0 }- K 函数原型:/ _# M7 z g6 Y* r0 O: q
int socket(int domain, int type, int protocol), {/ J- P$ p/ Q( V3 I# k: k
domain: 协议类型,一般为AF_INET
! c \5 w5 ~5 B: ]- p0 |" |1 ^ type: socket类型( w p/ `$ ? y& k
protocol:用来指定socket所使用的传输协议编号,通常设为0即可
/ h1 {- r/ s; P) ~: }. W8 Z
5 _5 y/ q9 d' S s2 p" R 2 bind()
1 k0 u' f# N5 i* { 头文件: u: l) J0 k" |0 Q
#include <sys/types.h>3 k: |: O; o2 M; G2 ?( V2 o
#include <sys/socket.h>- T# T8 H3 ]' V
函数原型:
8 P% C/ e) W. H+ v5 F1 d1 O int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
, n' e4 S# {3 [4 k6 N; c1 ?7 ^$ [ sockfd: socket描述符
3 E8 I/ p# c0 e( L' P" ^4 f my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针0 [8 f& _+ m1 L! l
addrlen:常被设为sizeof(struct sockaddr)
4 @! z1 z% W0 Z2 A7 u3 U1 q9 m9 z. l9 z6 `" b1 C
3 connect()
: Q+ m/ S5 H: P5 a4 [ 头文件:
8 D8 f9 t; i. i7 J: ^. M1 K m9 Q #include <sys/types.h> b& {1 G- l( E8 _
#include <sys/socket.h>; k! C8 C: `" g# Y2 M
函数原型:" Y. q2 G& \, _9 z( p% E1 b
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
: M+ K" O! k, e( f; j0 B" z2 b2 I8 u sockfd: 目的服务器的socket描述符2 n$ F' W/ m) D% E b
serv_addr:包含目的机器ip地址和端口号的指针
% K2 V1 E! k- h. W addrlen:sizeof(struct sockaddr)
5 F: E" f9 u/ z8 C: y9 t6 ?; B( J+ } V9 W
4 listen()
3 ^" U; h1 t( V F( S. M/ R 头文件:% X; o7 K: S1 ~8 {
#include <sys/socket.h>& z$ p! `5 [- K3 P1 ^1 i- n% p! o9 F
函数原型:
0 X8 V E% S9 M5 x1 h2 R0 F+ V int listen(int sockfd, int backlog);* u0 ^1 t, f0 P! H6 x- A
sockfd:socket()系统调用返回的socket描述符6 E4 q' h# ] W1 T
backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
8 [& A$ ?" \( y: y* q& l! X
4 ~1 V' _$ @6 v, q, p4 ~3 x& N# l 5 accept()
3 ]- u9 I7 Q7 C 头文件:
7 _2 L1 C, n& F$ k+ S5 @% \$ ] #include <sys/types.h>' l/ \. \0 ]- g: m
#inlcude <sys/socket.h>
3 T4 F4 x9 `' ^0 O s5 e 函数原型:
/ o* N- G, R0 E. {9 T0 c int accept(int sockfd, void *addr, int addrlen)/ L5 \) Z" m2 ]# }0 k
sockfd:是被监听的socket描述符
* e3 q. ]: B4 |# Y4 W! v addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息; H" E; F! c; `
addrlen:sizeof(struct sockaddr_in)! T9 ~) N* p, |! c1 [- I2 `" z
6 B, V. ]3 q8 A$ w# M1 h 6 send()0 M- u. F2 j( ~% x+ V
头文件:
' l O2 z* z! V" }1 l8 Q/ E #include <sys/socket.h># h: V% v1 n+ X1 \8 `
函数原型:
/ k" n# I- v* q0 D i9 _; v$ t int send(int sockfd, const void *msg, int len, int flags);
^: V* }0 Z! U! C& p! y# q3 Q sockfd:用来传输数据的socket描述符
( P. |+ _+ y2 c. }# q; H msg:要发送数据的指针
& q* o6 u' O9 X flags: 00 C. C9 d7 e( |! U+ r$ s/ F
/ K. ^% q% ?' \" e 7 recv()
6 D+ q* ~1 d& S7 |0 R8 O- T2 C8 v0 P 头文件:
" x3 A( q" T- q* O; \6 U( Z #include <sys/types.h>
( D2 b, M4 a5 c6 K #include <sys/socket.h>
% R) S% X" F, s; e$ f7 e 函数原型:
% l% Y/ q/ E4 F% t$ m. E' S int recv(int sockfd, void *buf, int len, unsigned int flags)
$ N1 ^: |! _# \( z I8 ` sockfd:接收数据的socket描述符
& v3 {: f9 j/ ^# h% k buf:存放数据的缓冲区4 A0 P. W. p }
len:缓冲的长度
! x2 R5 c2 a- T+ V: Q9 l F2 H' k flags:0
( E6 ?, ~0 U* k/ K, }3 \2 q: W: w, G R" _ B5 q) n7 h- ~- W9 ]
8 sendto()
! v" ?+ m' }2 \( C& J; d 头文件:! N. X* w y! C) x( f8 N: i
#include <sys/types.h>+ g( x0 ?8 q/ q" Z- j! o: h* I! X
#include <sys/socket.h>* s+ `8 b9 T% ]+ N# E J8 N# F6 i
函数原型:
( i% k7 j3 @' p9 V c int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen); i+ V$ Q# B- l. ], k% v) i
. d6 c7 H ?2 g. v
. e. b9 D. y# N3 N3 l6 d 9 recvfrom(). h: Y, s: c0 U r# R3 ~5 B/ M
头文件:( h) v$ Q& i& B) v$ w K8 ~4 o
#include <sys/types.h>
! b7 z5 ]- I- a& {# S7 ^7 A2 z7 c #include <sys/socket.h>$ A; p9 G" g' Z0 [. F
函数原型:
5 D- E* ~* Y: r" H' l5 ^7 E! {' V int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)' o% F4 \% O( E) c- |2 j
x. r4 M: U& Q; \) \1 y: \
/ t* ]' @0 u8 H9 ?- v6 m: k8 w
10 read() write()6 O" Q: x# |/ W9 j% J
int read(int fd, char *buf, int len)
- I q/ A6 i7 V6 d int write(int fd, char *buf, int len)
: s4 E1 Z' x* z; C# | 3 Z2 P2 i/ O% e, t C1 P
11 shutdown()
4 E" ?0 z( H# q& f close(sockfd); ^4 x+ J2 |3 ^4 K& e3 ~' w
int shutdown(int sockfd, int how). e! P) z; m- s% o, |* \/ Z
----------------------------------- [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等) 0 w; y# X1 W4 L( S2 s" Y9 E/ z
<sys/socket.h> //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
' H: r" U, [' q) Z7 W& Q5 w<sys/ioctl.h> //I/O控制操作相关的函数声明,如ioctl()0 Q: E3 ?! i- d" D9 q1 D
<stdlib.h> //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等. l1 }1 m8 ?' L* Q; b! I. W8 ^! u! \
<netdb.h> //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等
, C A" p, s6 ?. l<arpa/inet.h> //某些函数声明,如inet_ntop()、inet_ntoa()等) `5 ^2 b8 K5 X w: Y# c
<netinet/in.h> //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等 [size=13.3333px]------------------------------ [size=13.3333px]linux下socket编写常用头文件
. r0 U2 J' Y; {& o% [0 e6 Z
4 X& x& {6 k$ {" u- O; n* p[size=13.3333px]#include <sys/socket.h> //connect,send,recv,setsockopt等+ ]! H* t e5 A1 R# J: s) O
#include <sys/types.h> / W& |% R3 w) r" n, }4 z, r
! Y2 S8 n, [# L# Z2 Q4 \
#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons) P! I, J* P3 g
#include <poll.h> //poll,pollfd) A" G: G! H, L' _
#include <arpa/inet.h> //inet_addr,inet_aton3 a6 q; \. J7 N4 F# y$ F1 S
#include <unistd.h> //read,write% ]; r, J& t7 n. F: S) _; P) W
#include <netdb.h> //gethostbyname* h. o; j; D9 j7 K! A: ]
# E1 Z5 h# X' b4 e, h#include <error.h> //perror% p+ I: g1 p. D ^9 P
#include <stdio.h>
/ }7 n! |+ J8 E8 g#include <errno.h> //errno
+ D) b) s$ l) U: F- ?, T; q2 h7 M5 B& w/ { ~) o
#include <string.h> // memset2 ]) z7 Q9 B* O2 W$ O& q& T. U
#include <string>2 p1 J4 C$ b2 o( u
#include <iostream>
7 P/ E: b$ ` `- B( e
' t- y8 D$ [# S- l9 n9 Q |