|
[size=13.3333px]一 三种类型的套接字:
W2 z1 u/ x) C1.流式套接字(SOCKET_STREAM)' X0 V, f# L& v/ P* c/ k
提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。
8 h+ R1 q3 P% l2 u* N- }2.数据报式套接字(SOCKET_DGRAM)
+ y2 z9 ~! `- H& j 提供无连接的数据传输服务,不保证可靠性。. b, P/ }0 f7 O8 ^2 z
3.原始式套接字(SOCKET_RAW)
) ]7 o% U- p. z 该接口允许对较低层次协议,如IP,ICMP直接访问。
; _5 D, a8 m% t2 [* M8 H Y1 B4 T4 V8 H* i8 X% r& L2 b
二 基本套接字系统调有有如下一些:
0 e' [! V% M' ?1 E8 S$ J 创建套接字: socket(). z+ E9 n+ I- a& p& e6 @. C
绑定本机端口: bind()( N$ w* A( X' v" A6 t- @
建立连接: connect(),accept()
( n B* l3 p/ ^% w X6 E 侦听端口: listen()
; p( n0 ]# W3 ]8 D0 ~- k4 V+ p 数据传输: send(), recv()
% d+ k" Y. @9 O: S8 d* Q8 v 输入/输出多路复用: select()
0 Q I) G' y& P5 t0 a 关闭套接只: closesocket()
) C- H3 c" D. m* D4 F6 }( _" v2 g
/ H- T* k) E: W9 I5 V' W9 s: P三 数据类型
# z8 K( y4 Q; k struct sockaddr% j8 H, J( t1 q% o/ x/ i, E$ T9 F
{" ^( U1 Z+ f3 t0 W
unsigned short sa_family; //地址族, 一般为AF_INET
0 l- o( i$ S# U0 C3 w- t2 ^4 r char sa_data[14]; //14字节的协议地址
5 M# V/ a$ Y1 `5 _& S3 N' K4 F }9 o; `4 t/ ` k) B/ }$ p1 F7 b
/ [! e' a, k3 U/ N' x6 `* Q- L9 U1 V
struct sockaddr_in0 n. V* i; ~" n1 ] G Q
{# [* b* _ u; m) U9 H
short int sin_family; //地址族
9 B1 j. W5 S0 U$ f. Z unsigned short int sin_port; //端口号/ r5 X; [6 x( ^6 T' M7 x. v6 L
struct in_addr in_addr; //ip地址
* `( X- h! B9 o! a# t unsigned char sin_zero[8]; //填充% O- A8 I' f2 K. X# F0 e3 g3 d. X6 N
}* q7 U9 l( M5 {
' j# v+ o1 ?) F
四 常用函数9 _2 d/ j! z8 T2 H
1 socket()' P( n3 t7 t. N* X. Y" e
头文件: . Y& Y8 @: E! J+ n% F/ V5 V
#include <sys/types.h>" z3 e6 z6 X \& ^* J
#include <sys/socket.h># M/ t6 n& k" ?6 B* B
函数原型:
9 G- K+ P4 @! z/ J3 t+ ^ int socket(int domain, int type, int protocol)4 G4 D! Z1 b+ Z1 H8 k0 N
domain: 协议类型,一般为AF_INET
9 g/ W% P7 O: |: t$ S type: socket类型, n* W5 `6 L- b5 x6 V' r
protocol:用来指定socket所使用的传输协议编号,通常设为0即可
6 ?/ T. u( ^1 X! y* M
7 }; N( t b4 L2 u! k 2 bind()/ B+ I+ u( a# M2 y1 m& S- u3 Z
头文件:! s" }8 F+ u: h& \. j
#include <sys/types.h>4 `* f0 v# f7 M! N8 d
#include <sys/socket.h>
" {7 c/ Y, u0 J/ ~! F# f 函数原型:2 A7 I4 m+ p6 l& I2 q# W
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
: I1 q6 H X7 ]. M5 r sockfd: socket描述符0 u3 m* v8 D5 R) B; T
my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针2 E8 m% c+ z& r* W6 y
addrlen:常被设为sizeof(struct sockaddr)2 L6 M9 O- M, n- z' u
3 o# v6 p2 {9 o5 E! N 3 connect()
+ b8 d# v/ M& s" O 头文件:. H R: M# l" F9 A( t$ s; e5 N
#include <sys/types.h> ; x) {# `, i, i
#include <sys/socket.h># u( C f% A+ `5 z- M* Q
函数原型:: m- T1 h4 P2 P- T7 d: x
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
7 |4 [/ S4 V; y0 c sockfd: 目的服务器的socket描述符% y2 w; \3 E3 X |7 y1 j9 G( h/ _5 t+ F
serv_addr:包含目的机器ip地址和端口号的指针3 _3 t6 k8 m# y: T( [# A& T
addrlen:sizeof(struct sockaddr)/ m1 m: z& Q: d7 M9 o1 G# [ a
+ v) L: x u$ d w) g- F4 a+ c! T* Q
4 listen()5 w8 C: z2 C% G: f1 @4 A
头文件:4 |1 B! E9 l4 @& p. p0 u2 U4 y [
#include <sys/socket.h>( \! F% p S) b8 V& L1 Y
函数原型:! d0 ~+ w) N# W1 t$ D1 d
int listen(int sockfd, int backlog);
- x/ U6 g3 s( L+ d. H" }4 w( w sockfd:socket()系统调用返回的socket描述符1 B6 X: N' | ~' D0 Y; w5 S
backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
% y( p" `' w3 G2 F$ m4 P7 G! z* _! M6 r( ], Q& _! K
5 accept()* q5 V# m! ?: V0 X7 H* o
头文件: & E& s- o4 E4 Y/ f
#include <sys/types.h>
2 o; M) D4 O" S3 o* h7 u+ b #inlcude <sys/socket.h>
+ u1 ~4 R+ D2 g( b% ]6 i+ t 函数原型:
7 X$ e7 t+ z3 C3 D N1 O int accept(int sockfd, void *addr, int addrlen)
8 w6 R$ ~4 ^9 Q3 o; W sockfd:是被监听的socket描述符$ A& }$ w. X/ v8 X% X9 m
addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
/ X$ V" M; R, b5 b: Q8 e. V7 f* V addrlen:sizeof(struct sockaddr_in)- I7 `# K8 ?0 y" o
1 j6 |! o8 p* d& v8 ` 6 send()
9 J( C0 D' M( r$ Q2 Z3 m 头文件:6 V' c" V' Z. b: T
#include <sys/socket.h>( ~3 D) P) ~& l l! y
函数原型:- Q+ e$ @- z, ]. A
int send(int sockfd, const void *msg, int len, int flags);1 f) G* O, a/ Y1 k5 `; a
sockfd:用来传输数据的socket描述符
; o- Z* L4 A$ x8 y$ C3 ?# b% ~# g/ q msg:要发送数据的指针
5 j2 ^4 x4 s& P: o flags: 0
9 P5 S9 s [8 k3 G* Q. X - R, v/ j7 \2 H a
7 recv()7 Z" a: k8 ^" p, ]* R- |
头文件:1 Z; R& j& H! F* S/ p% r5 B, i
#include <sys/types.h>
. w9 J0 D9 ^: g N* m! g! u# M$ { #include <sys/socket.h>" I4 X/ u: P; M3 M
函数原型:
; X/ B7 R# t# h$ ^+ K8 ]# m int recv(int sockfd, void *buf, int len, unsigned int flags)# x' X( z+ E+ E( J( ?" C+ s
sockfd:接收数据的socket描述符
; I% W8 L% k [/ E' E8 h$ H buf:存放数据的缓冲区# R4 g, r1 X; r" M0 l
len:缓冲的长度
1 I _; g1 K6 x- n8 ^4 h0 ~ _ flags:0
" F, i7 u8 Z' L& G v
) A: E: ~+ D) Y! p9 H 8 sendto()1 @/ K* a5 H& Z
头文件:$ `& r2 q5 i! V) ]4 C
#include <sys/types.h>
) w5 R c- Z8 s. t7 X #include <sys/socket.h>, v1 c7 B7 O9 U! ~) k
函数原型:& o4 i2 Q, j7 d8 @. L% S9 a) X
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);8 F. S2 i; r, p- c/ t# a' S) {+ P
+ i% _# ~; F0 @2 P7 `! \' `& a6 {
4 H2 W: n* S0 N6 ?1 o/ Q 9 recvfrom()* {3 T; m+ u3 l S/ |
头文件:+ P; i) e; J7 d, s; `! g u9 _
#include <sys/types.h>
5 j, ~6 y/ a! u$ O5 M #include <sys/socket.h>
! N. @5 |' W( \& D- q* ] 函数原型:: j% T+ Y' Y0 [# M/ o7 t- d' j8 g3 Z& D
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen); n! j2 O8 _7 q- L3 S
8 V/ B7 }' `9 e' T5 [3 T9 U
% K# b/ U8 N9 V! `$ g 10 read() write()
9 a: {7 J4 W& K# V8 X4 q: K int read(int fd, char *buf, int len)
; f, a: A$ H& h. k8 G$ o int write(int fd, char *buf, int len)
9 a( M9 u4 g! _3 M : l5 U$ d+ ]: e3 u
11 shutdown()4 s6 M9 q& z5 B
close(sockfd)! \' p) B) I: O/ O7 p$ j3 Y0 X
int shutdown(int sockfd, int how)
& f5 S# i; } J9 v) B- 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等)
, Y4 o/ W6 y9 p$ V' i/ \; C<sys/socket.h> //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
. Z: e2 s: K! Q, x! [ T3 }<sys/ioctl.h> //I/O控制操作相关的函数声明,如ioctl()3 X1 o# C! G k/ s* [6 W3 ^ B3 Y
<stdlib.h> //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
/ j8 v1 }7 r1 h. P<netdb.h> //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等+ T* T+ Z( q0 L+ u& L! b: U
<arpa/inet.h> //某些函数声明,如inet_ntop()、inet_ntoa()等7 P1 P/ M4 u2 [% [& L) w
<netinet/in.h> //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等 [size=13.3333px]------------------------------ [size=13.3333px]linux下socket编写常用头文件
+ i' `0 f. s" F
: y& C: b# D/ o[size=13.3333px]#include <sys/socket.h> //connect,send,recv,setsockopt等' p% c7 x4 L3 B$ J
#include <sys/types.h> 8 o2 A5 @( ~$ }. M3 N
/ ~# c+ L5 q1 s: Y A u6 g& t$ d#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons
5 L' C4 W! G! N, w9 ~# ]7 Y#include <poll.h> //poll,pollfd
2 r2 ^5 e7 w9 ~, M. a. W#include <arpa/inet.h> //inet_addr,inet_aton7 u% `' r9 [9 ]' L
#include <unistd.h> //read,write
0 M( |8 ]& C* x6 d5 h( m* x#include <netdb.h> //gethostbyname6 S2 I$ q4 U' g; h ]4 |0 v* I
7 ?1 J# G0 H7 ^; o#include <error.h> //perror. y, B U% R$ j7 } z0 q% m
#include <stdio.h>
k: m2 d' u) Q0 e2 |) ^# `#include <errno.h> //errno
0 z) k# U, ]& T$ R* T! ?( X- r, n
$ t: U$ I% B: `, \9 \#include <string.h> // memset+ D+ u- `5 `& |3 |; j
#include <string>
c# G7 r4 X7 C+ p2 t$ K! [" f; W0 }#include <iostream>
* { R7 _, s5 S! l0 O6 h
- D4 F7 u& \& h' o |