[size=13.3333px]一 三种类型的套接字:
4 X0 T$ v$ i3 G6 E' N6 [+ W1.流式套接字(SOCKET_STREAM)
' \7 O. {7 [5 c" U0 E 提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。) q X2 \) V" W
2.数据报式套接字(SOCKET_DGRAM)& t1 W1 {0 A& R$ m: h
提供无连接的数据传输服务,不保证可靠性。* Z5 q8 I, {; f4 B" T! Q4 q
3.原始式套接字(SOCKET_RAW): K; ]: ^' y8 Z1 v
该接口允许对较低层次协议,如IP,ICMP直接访问。
# B. I: p* X5 c0 n$ h) F
% a; ], k2 B0 E0 v二 基本套接字系统调有有如下一些:
. D8 w' {. ]2 ^ z) J& j 创建套接字: socket()
+ v$ o6 x% n( E 绑定本机端口: bind()7 M* c3 J( p% g' d1 X
建立连接: connect(),accept()
7 M' g+ g/ W" W1 o- E 侦听端口: listen()
3 p& Y( q$ F5 z |" J4 x- G4 m1 N 数据传输: send(), recv()1 G/ M% \- \; x7 V4 F$ W
输入/输出多路复用: select()1 [5 ?1 ?& J3 R1 f7 ~2 }
关闭套接只: closesocket()% f# m r7 A$ ?) l" \6 L* L
( G2 [. J2 @& H/ e8 }; u5 b
三 数据类型' H) K9 E. v6 k) O
struct sockaddr* A4 P& Z8 ~- [; M
{
$ k: w1 ~2 H; m$ y. ?- r! a unsigned short sa_family; //地址族, 一般为AF_INET, i, Y0 ^: H: ^
char sa_data[14]; //14字节的协议地址 g5 h. w- F0 B6 \7 x
}* k3 x& y+ u, p, R' n
% X; I/ e$ a! {5 @6 A struct sockaddr_in/ P3 ~: @! [& {4 ?. w4 c- _, ?# w
{
# j' Y4 A3 w4 L. L7 P short int sin_family; //地址族
" B$ E' k/ E) Y+ | unsigned short int sin_port; //端口号0 ?2 ~: ?5 P& w! I! \" E" s
struct in_addr in_addr; //ip地址' \1 a: W4 q0 p# G& s# \' E. S6 g
unsigned char sin_zero[8]; //填充. O: U2 {' }& B, W( s& W* U3 |
}1 M v+ }8 m2 F6 V' X9 N% L
7 U" {9 k" M9 O( }) A* T
四 常用函数
% ~/ Y! c/ i% ~* Z$ T, [& J; x 1 socket()
* q. I/ n( y$ |% H2 d- p 头文件: * r4 F) k* q0 C* U! [1 i- u! \
#include <sys/types.h>
( x _4 }! k" Y- J ^ #include <sys/socket.h>
; o8 C0 U" \+ x 函数原型:
! T2 C" @4 M" Y. K m$ k int socket(int domain, int type, int protocol)' H4 M! w5 ]% H0 i# n3 o& R0 g
domain: 协议类型,一般为AF_INET
# \' @/ d* M- u$ l4 D4 b! A/ p1 J! x% | type: socket类型
$ k) Z* F3 I$ T) u: i: |5 J protocol:用来指定socket所使用的传输协议编号,通常设为0即可& Q% ~1 }+ v2 H! M
9 h) w& k. S/ M4 V% Z6 I$ U
2 bind()& m- m2 n6 {: {; C! h Z9 p ~5 o
头文件:
6 C0 A: X2 c" d9 x0 S8 A #include <sys/types.h>
; N2 y6 w; I9 T" \! o #include <sys/socket.h>
/ F# i$ V# w- a1 g, e( z4 E 函数原型:
8 l7 j9 @1 F; ]7 P% f int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
. w. c9 L" T( s5 c: S' e( H sockfd: socket描述符* Y5 ]8 O5 A! Z) T- m( i( d1 f
my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
' l; [- M1 i3 R8 b addrlen:常被设为sizeof(struct sockaddr), k3 I/ N. s8 |* ], {
5 B: A6 A1 A! E; @2 } I, H
3 connect(); o v. f5 z- f! e
头文件:
& \" `; Z, T; S6 p8 }2 o6 D: u5 d #include <sys/types.h> 2 x3 L% R" p/ E' P$ l/ k
#include <sys/socket.h>: p& M6 x6 c2 V! S, l9 t
函数原型:8 M( v; D5 @8 t$ z5 t
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)6 i) d+ A9 w7 n' m
sockfd: 目的服务器的socket描述符6 A1 H! S1 X* ]2 x( z+ J
serv_addr:包含目的机器ip地址和端口号的指针2 o: T$ i7 m0 U+ k
addrlen:sizeof(struct sockaddr)
8 r! b4 Y+ p6 |3 l% P9 ^$ ^( O1 w. H. V ^
4 listen()
5 v1 D8 [6 H& b% B1 f6 F 头文件:, y5 T f% t6 E6 u; {% O( A
#include <sys/socket.h>
# C: g2 z B* p7 j$ J, W7 k 函数原型:7 n% t+ w+ x. }4 h+ r
int listen(int sockfd, int backlog);0 `: ]% P* g, ?6 m+ z! ]
sockfd:socket()系统调用返回的socket描述符; y4 C/ H1 v2 y7 A$ h9 Q/ v. c* a, i
backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。: c3 E5 w2 y! U& c5 }* k
6 n/ [5 W( K! Y$ b4 S9 n/ _
5 accept() } G4 |9 r. ?: G6 r7 G
头文件: 0 L- j' {# U6 Z- @- \2 ]
#include <sys/types.h>
$ d6 C# H: G% q8 J9 z #inlcude <sys/socket.h>; K: w5 n7 K% G' ^
函数原型:; ~/ t* G& s7 J8 `9 ?
int accept(int sockfd, void *addr, int addrlen)
: u; M2 x/ ]) C: { U% E# j sockfd:是被监听的socket描述符' ^5 J$ p1 e; I1 w0 a6 ^) b6 E
addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
9 n6 t2 ~% f2 x$ r' Q: }1 e addrlen:sizeof(struct sockaddr_in)4 I: A$ L# U/ Q' z( M4 t; v) B
( Q5 y5 i( {7 A# L 6 send()# a* |; z& m. f- A6 F& @8 @( b8 K
头文件:, H: F" B" q5 b( |2 f6 T, {$ O
#include <sys/socket.h>, |, A, G7 n( V; x7 Y. B6 E, J
函数原型:3 @6 r5 \1 o# }$ y/ R, k. C- @* {
int send(int sockfd, const void *msg, int len, int flags);
, j, ?4 D( ]$ B- y2 s9 U2 v! ^ sockfd:用来传输数据的socket描述符0 B v) o7 c% p$ g0 f; c: e# p
msg:要发送数据的指针
( z4 _; P# N2 R8 W) G [3 d flags: 0
2 z5 L- Q5 \5 n' E- X
3 Z8 t2 ?% O+ V 7 recv()
7 v; @+ a1 `4 f. u1 x0 r( X 头文件:0 A' C+ } ` ]5 f P! U1 C
#include <sys/types.h>
- u& ^: b1 M2 @7 Z& H( m" J #include <sys/socket.h>
5 v9 U5 Z( m+ N) l+ q7 d7 T 函数原型:: l0 \% S6 b# u+ |( X5 h3 n
int recv(int sockfd, void *buf, int len, unsigned int flags)1 x. ?2 a% o; b7 m( u6 K) m
sockfd:接收数据的socket描述符
" g* y" ]! m9 _0 Z0 b: ~ buf:存放数据的缓冲区; {/ _6 S+ \5 c5 d
len:缓冲的长度
0 \$ j0 E( L6 S* Q' P, ~$ Q/ j flags:0
9 ]5 ^& ]3 }3 u( c q. }+ E- L9 d' f4 h$ ^' J; H7 Q
8 sendto()3 Z+ n4 t+ x, V$ l
头文件:
; u, p* ^. f; d9 W+ r$ c6 }8 \ #include <sys/types.h>
0 V4 h/ `0 E. \ H# Y( W) ? #include <sys/socket.h>
) G. k& a1 e0 q2 d; j 函数原型:7 G/ O$ d% I7 W
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);' _; v) b& d0 t( z1 k
& e$ e. K0 o# z- J5 L v: U. b
+ Q* `" u1 K5 B4 o% _" s 9 recvfrom()4 Y% z0 A* \! k% R! X. R
头文件:
/ n2 E& ~/ {5 k4 ]% e0 s #include <sys/types.h>
l' r2 @2 q8 h #include <sys/socket.h>
8 H; x y- | b: ~1 ]! l 函数原型:
. r" G! Y j6 z# ^( h% k) M' U' M+ A int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)9 n# w. l2 B/ H/ H* X
# T- @$ j* X- T% Z# z$ {2 |. y: O" w
* J$ Z$ o" _5 [: O* h
10 read() write()
- l' I. V+ ~, D, {: n# ` int read(int fd, char *buf, int len)5 k* W3 u% S) R5 P, }& }: I: B0 R
int write(int fd, char *buf, int len)
t8 e- E+ P0 B
3 `/ d% ?( A2 I" M- P 11 shutdown()' P. _! X) n4 b3 n' v' v3 A. |
close(sockfd)8 U `' p7 W/ W0 z% X5 }6 g3 c
int shutdown(int sockfd, int how)
% g& c' h4 n% v5 M# f0 t4 D----------------------------------- [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等)
, u; m' E& i; C% @) M! e6 D! b<sys/socket.h> //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
6 L! v) V# {6 d* I. X<sys/ioctl.h> //I/O控制操作相关的函数声明,如ioctl()
* f. C+ L8 }0 @7 I9 `+ I<stdlib.h> //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
0 z% L' b6 W2 Q<netdb.h> //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等6 G( X# w( z' T
<arpa/inet.h> //某些函数声明,如inet_ntop()、inet_ntoa()等
' c( `9 l0 P. @<netinet/in.h> //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等 [size=13.3333px]------------------------------ [size=13.3333px]linux下socket编写常用头文件
- ?! `6 h) k- i* ]% v4 y4 g: o6 R0 L( s) @ O, g
[size=13.3333px]#include <sys/socket.h> //connect,send,recv,setsockopt等0 n, Y5 k' v' Q6 E# V; Q% y
#include <sys/types.h>
8 c9 g) I) A7 K' Y
, A5 V3 `1 Y E0 q6 b( K+ D$ ~* s8 a( K#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons4 j" x! R- ?! s- e$ E
#include <poll.h> //poll,pollfd
: M$ b$ R7 F, V+ K/ _8 F#include <arpa/inet.h> //inet_addr,inet_aton
% W' K# A6 a F4 g. J#include <unistd.h> //read,write" e) m1 N) m1 b" e) J% l0 |
#include <netdb.h> //gethostbyname$ l* W+ w% i& F) E) W0 O: p
$ H7 G a& I( `" B: P8 y
#include <error.h> //perror
' y) h; q9 c0 b* t& c e) m#include <stdio.h>
# [3 B' ]& u8 l# ^4 e#include <errno.h> //errno
% u1 ^$ @- B5 w/ m# G: v! ^2 @$ q% ?. d! n* U$ y: ^# T
#include <string.h> // memset
, Q% m7 S5 }7 M* ~3 Y#include <string>1 f# K) p! q! D. h9 }" I8 i- ]9 M
#include <iostream>3 p3 `1 [$ ~; b* Z0 n9 G
z7 _- B0 _& e& v
|