cncml手绘网

标题: socket编程需要哪些头文件 [打印本页]

作者: admin    时间: 2020-5-8 23:01
标题: socket编程需要哪些头文件
[size=13.3333px]一 三种类型的套接字:  }/ ]0 Z8 Y5 Q" \" H5 c
1.流式套接字(SOCKET_STREAM)
. i0 g7 v' Q+ W+ ^    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。7 x$ ]9 P6 Y' k
2.数据报式套接字(SOCKET_DGRAM): l5 A2 F% o6 T7 X1 T
    提供无连接的数据传输服务,不保证可靠性。1 }4 Z, k+ H: l, I% Y0 S
3.原始式套接字(SOCKET_RAW)8 E: a) \6 }: g1 l2 Q& t; C
    该接口允许对较低层次协议,如IP,ICMP直接访问。' k4 t2 [. l+ U
. A6 \/ F. K0 t6 g) g$ d
二 基本套接字系统调有有如下一些:( t  `) u9 D7 x! D1 y+ r0 ~# v
    创建套接字: socket(), l5 ~& z5 ^0 a6 G/ T
    绑定本机端口: bind()& `- m4 m5 S& I7 z0 S" d
    建立连接: connect(),accept()
8 P' Y7 R( `0 P    侦听端口: listen()
9 _, k; d- K) a! U    数据传输: send(), recv()
9 A+ F8 a" J! v! ?    输入/输出多路复用: select()
& P/ D/ h& g9 x2 W    关闭套接只:   closesocket()
8 S2 F- [+ V3 v( c) T& Y   
& w9 C  t  k( w+ K! z3 n三 数据类型
0 E0 c5 i; z2 m5 P8 F6 [" D8 Y! K    struct sockaddr
. f: B( m& w% ]' H. i" {& Q  z    {
7 f0 \- l" ?# e7 a8 I$ Q1 l       unsigned short  sa_family;   //地址族, 一般为AF_INET
' z2 R- [9 ?) A       char                  sa_data[14];   //14字节的协议地址
/ t5 H4 j) Y1 {2 j  {& T3 z    }
; R, ~6 B/ a( r$ N' v. z  k& l/ t- _/ R$ S) Q
    struct sockaddr_in/ v) N. g% V& N2 f9 W, P5 h- ~4 e
    {) v! [1 U% P! k9 [
       short int                     sin_family;   //地址族
$ T/ `' ~: z6 S" y0 t$ G: q       unsigned short int      sin_port;      //端口号& g# N& d: h2 J* r/ R
       struct in_addr             in_addr;      //ip地址
, @9 ~5 E% \. U/ ~9 r2 S9 |       unsigned char             sin_zero[8];  //填充" _0 F) O! ]# N& q( c
    }& g  }/ C, ^$ d, h. ^4 t4 F
% J/ D2 F# Z" z7 c9 @- u4 G8 F
四 常用函数& J* Y* T  ^9 ^7 n; F
    1 socket()
. r# d& o( n% _/ }' U       头文件: 2 z7 V$ r0 F* \% h8 k
       #include <sys/types.h>
( Z# o1 s3 @6 \5 V* `       #include <sys/socket.h>. _  T1 k+ z0 }6 S8 I% h* G
       函数原型:
( i( i' Y+ ^) T1 I  x       int socket(int domain, int type, int protocol)
6 j- E0 ^# r9 o, V' J6 C5 D          domain: 协议类型,一般为AF_INET$ v4 A" F' `5 o
          type: socket类型
4 k$ Q2 j, ^# i: Y0 L          protocol:用来指定socket所使用的传输协议编号,通常设为0即可+ r) V, H# o( h' }% L' C* {. m9 i1 ]

% z6 R- W; [. X/ Z: z    2 bind()
1 l8 R- ?3 m: u$ R/ A# Q' p# |       头文件:' x: N, o; |* t+ C: G
       #include <sys/types.h>( |% I; _& a- v2 A5 I
       #include <sys/socket.h>
" {$ u, a& Z. u- I       函数原型:
* M# d) R! U" t0 Z: n+ j       int bind(int sockfd, struct sockaddr *my_addr, int addrlen), _, U3 X( S+ p, e0 s4 T8 F  y" B) E* p8 Y
          sockfd: socket描述符
! B5 x, J4 s9 H; q          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
1 Z7 t$ K9 A. Y7 L, W- L0 ^          addrlen:常被设为sizeof(struct sockaddr): }1 }# q+ Y+ }
, y2 E' S0 D! `; `& Z4 U
    3 connect(). }9 G# g# E7 o8 T9 X
       头文件:+ M. V% X% A* `9 q) j% s% _4 S
       #include <sys/types.h>  ; m- D' M) g9 g) x1 a/ q. W3 N
       #include <sys/socket.h>
5 Y, q3 H4 P" p" E- c7 \       函数原型:
' |/ z& ~( M( l! f4 L. r       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
$ p& Y5 T: l9 Q; [           sockfd: 目的服务器的socket描述符. R% x' S) c6 W) L
           serv_addr:包含目的机器ip地址和端口号的指针; h; [. j+ Z, b, v4 n  n
           addrlen:sizeof(struct sockaddr)) C5 ]$ u+ ]1 y7 N2 y# G  G

: ^: O  I5 i; r    4 listen()& y1 q& x2 S2 n4 U
       头文件:( |; u. Z$ J) I* }- `9 \
       #include <sys/socket.h>
$ u. J% Q  d2 X& d       函数原型:
3 M+ X4 D) U4 c3 [4 _+ u       int listen(int sockfd, int backlog);
7 k+ u4 [+ C  j           sockfd:socket()系统调用返回的socket描述符, `4 ^* S! s0 s" ?
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
1 L, V& Q8 R6 U9 j$ Q. F; T
% p: d) n4 P2 G" j3 e    5 accept()
. W2 ?# a0 P7 k# [, _: N5 X       头文件:   
. l/ `* @9 l# [& f7 C+ y0 C4 D' Z       #include <sys/types.h>
7 o/ s% x8 a# Q+ Y1 L       #inlcude <sys/socket.h>
5 I# @6 A6 i" @/ i  U" l. v       函数原型:
) o* \. O- L! G       int accept(int sockfd, void *addr, int addrlen)9 z! G: m$ I! W7 O
           sockfd:是被监听的socket描述符9 }5 }! h! }. o7 O6 W3 J" t
           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
* ?% l2 ]1 o5 G           addrlen:sizeof(struct sockaddr_in)8 q$ }) y2 x2 J) i, d8 }
       + H. y( N+ \- i. v- X& L# B4 B
    6 send()6 ~- W) q+ z4 u% p6 G3 {4 }2 B
        头文件:( l/ i! S5 g# Z4 P2 S8 w
        #include <sys/socket.h>" N) Y8 w; M  v, G
        函数原型:
: ^  x& G6 @( q) z9 G3 R        int send(int sockfd, const void *msg, int len, int flags);
$ I9 W/ H6 E8 I           sockfd:用来传输数据的socket描述符
& G/ f3 \% }% n0 X           msg:要发送数据的指针
& @* j/ P+ S8 h           flags: 0
- `# N4 V) P1 _% ~1 y      
" k, @: q, ]: s- @/ a4 m' |. X    7 recv()
' m6 {3 F5 b: I  h' X9 N9 c7 y        头文件:2 P5 n/ \  w& L4 E2 b) A
        #include <sys/types.h>
9 j& j& [5 \4 J# h( J        #include <sys/socket.h>
& {4 M+ ]$ r! Q% C. B7 [        函数原型:( ^) b7 V- a2 g/ z+ a9 r
        int recv(int sockfd, void *buf, int len, unsigned int flags)
) z1 e# k8 o- [- t          sockfd:接收数据的socket描述符# `' @. Z  z7 v0 f4 y- ]+ W
          buf:存放数据的缓冲区- R; A  R- x* z- k
          len:缓冲的长度( J' v5 ?! d' ^# D" J0 w( ?) ?
          flags:0
+ j3 y$ u. q6 a, r1 h/ b. o9 A
- W5 R6 g8 F% `- ]1 f    8 sendto()
3 z, ]: U; O( d( H       头文件:
' V- N( ?; `; k9 ]1 Y9 ^5 c) }       #include <sys/types.h>/ l8 Z# Z; ]- q1 a0 R9 S
       #include <sys/socket.h>+ ~% I1 H; b5 c% \: m7 C; M8 f
       函数原型:
3 a2 }" t  W! ]! ]& v       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
& s+ O, c  o  O        
) L: p3 g5 p0 Q& m5 ~5 ?/ g! d+ D9 x    $ h. i+ N0 k+ R1 @
    9 recvfrom()
- u1 N3 v: h8 P1 A2 d1 |       头文件:
+ f3 R3 |' k9 K3 ^: w7 N       #include <sys/types.h>
/ T( m" K( \/ @$ z$ `       #include <sys/socket.h>$ r4 O" c, c+ B8 b9 ?+ i6 O
       函数原型:
7 {; a& o+ K" l5 ~       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)5 A9 Y$ u( [7 ^3 o# x
- X: L! y% I: G( @! I; _
    5 b6 j) N- y3 M+ b9 O
    10 read() write()' e3 ^$ ~/ o- v7 d
       int read(int fd, char *buf, int len)
& n# d5 L* b. C  L9 R, h8 J       int write(int fd, char *buf, int len)2 @  A/ d7 l6 B* r
      
/ k& s% Y% Y2 V, n, |! q0 f; P    11 shutdown()7 x$ T3 S1 D$ W) A
       close(sockfd)" I- Q0 C! q$ U5 }' p0 b
       int shutdown(int sockfd, int how)9 m1 U( G" C; d$ i& z: A
-----------------------------------
[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等)   
, U0 Y# W9 B! Y6 n4 Y" ^( K<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等. t: Y& Q/ x, I$ m( X8 p
<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl(): l4 t8 c$ A8 x) X  \
<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等' E2 t" I9 v/ }- U0 S. O/ `
<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等$ `! p+ V/ _9 l
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等5 K5 `% V" z$ ^5 c1 q: H, K
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
9 q9 j4 B6 X, e: G1 y0 l! O+ P# f; g$ B0 p! g9 I+ w' ]8 m
[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等7 C! P% B* ^, `1 a9 N
#include <sys/types.h>      4 i3 ]9 E9 n% E8 ]* i  k; {6 _6 a, B
( e8 I+ V' p2 F5 w, Y" D
#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons$ e- P: T/ J$ _4 ^
#include <poll.h>             //poll,pollfd1 X. E1 F! G6 v4 n* `
#include <arpa/inet.h>   //inet_addr,inet_aton7 i- g9 ~( z; V1 b
#include <unistd.h>        //read,write' ^0 {* _, I7 Z1 m% S* W
#include <netdb.h>         //gethostbyname; v4 [8 S4 v) e3 w9 B" M8 B6 I

* h& \6 m) B5 f" q0 L% _1 W#include <error.h>         //perror
6 g( H; I) @  L: P0 t#include <stdio.h>, Q# d! j3 L2 a
#include <errno.h>         //errno- Y8 ^2 C% u  Y) W) ]7 n

) ~, a6 p9 P1 c/ N: L" f5 h#include <string.h>          // memset- N& s) ^! a( L, _7 e# v# I% {9 y
#include <string>: P2 U0 s1 A% R" _3 K2 w
#include <iostream>
2 {- J0 J( j: o3 M

2 _& R$ ^6 j& K( P0 K% O




欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2