cncml手绘网

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

作者: admin    时间: 2020-5-8 23:01
标题: socket编程需要哪些头文件
[size=13.3333px]一 三种类型的套接字:' o5 q5 o0 c! t- F7 E7 e# w! q
1.流式套接字(SOCKET_STREAM)0 p  A8 z, q% r$ g
    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。
- L/ E$ A+ k: O' F" C! t* H9 p2.数据报式套接字(SOCKET_DGRAM)& p0 s" w0 `$ Z$ u4 M0 Y6 R
    提供无连接的数据传输服务,不保证可靠性。# g9 P6 ~3 l( h" Z4 i" P$ G, L0 f
3.原始式套接字(SOCKET_RAW); {; q' L5 w( E
    该接口允许对较低层次协议,如IP,ICMP直接访问。$ m# {  E7 ?. l. [7 Z$ D% Z- j
1 Y1 J' a( d' p6 C! a* O( m+ D
二 基本套接字系统调有有如下一些:
' P( N/ Q4 l% u) o) ]  E& I. s    创建套接字: socket()& ~( b* x! Z: l
    绑定本机端口: bind()
; Q& q1 h3 f$ J0 H/ r6 C" r% F2 S    建立连接: connect(),accept()
8 O+ h$ ?5 l) }3 I2 P    侦听端口: listen()
6 l; j0 S$ o, |2 k1 j6 a    数据传输: send(), recv()
3 a; u0 {* K$ t9 `6 w" L- }    输入/输出多路复用: select()1 P6 O9 y9 U1 x9 I
    关闭套接只:   closesocket()
& A4 z0 e& t+ [- e6 g   
; U* X% |8 o% ]6 V3 }三 数据类型
" d  [/ {; y  J& i( D  u/ @    struct sockaddr8 ^: J) k2 Z$ g0 M8 ~
    {6 i6 c6 ~, s) K/ a7 R$ ?
       unsigned short  sa_family;   //地址族, 一般为AF_INET+ A! w, u" V0 J4 M  G: H7 z' G3 {
       char                  sa_data[14];   //14字节的协议地址
. |* G. v3 o" G$ H2 u: G% Q% F    }
' W. w' n5 @/ Y, Q% s
# o% ^1 i( A, O4 z    struct sockaddr_in
5 ]. G  a# j& ?    {1 ^; H+ p5 s$ s, c  Y0 Z/ U
       short int                     sin_family;   //地址族' a; W0 [( W, I! ]' n
       unsigned short int      sin_port;      //端口号0 {; B$ A1 f3 _: |4 p$ W
       struct in_addr             in_addr;      //ip地址
. i" Q# _4 L8 q/ V3 R2 E# h0 T" m       unsigned char             sin_zero[8];  //填充
( v1 s5 g: A3 T  x* z. }: ^    }
9 A3 ~; G: w" b: P$ M/ Q4 _
4 O8 R% p$ r: @$ E6 R四 常用函数
! q+ ~8 z! @7 P; x8 ~3 M* D    1 socket()6 Y8 `: ]+ x' E, h2 s5 s2 _! i
       头文件:
( E  f  R2 ^3 M8 g8 ^$ N0 e0 \. B       #include <sys/types.h>8 j) r) w8 b; \+ w
       #include <sys/socket.h>
) i/ Q% q5 S9 Z       函数原型:
4 b/ A0 z+ r& k; R  O' `/ J. s* c       int socket(int domain, int type, int protocol)
# k% l% _! o, I1 E* b2 c1 J  j) f          domain: 协议类型,一般为AF_INET( M5 f- Y0 o: O$ Z6 j4 J
          type: socket类型
- P: h; a, K6 c6 D% U* V          protocol:用来指定socket所使用的传输协议编号,通常设为0即可
1 U$ @! C0 m; h( h& Y
# O/ b4 a. T# T+ H    2 bind()2 `* k! |2 F! v6 n! x% n3 S
       头文件:
2 C  k9 V4 g5 G5 K6 {% }% P" o. b       #include <sys/types.h>4 \2 _( C1 ]) F: x- x( i9 c
       #include <sys/socket.h>
( r0 E/ f4 ^5 ?5 i       函数原型:2 C0 f( _& B% P0 K$ g( ?
       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)8 L) Q' `' S! x) Q1 h- h( r! ]
          sockfd: socket描述符
6 Y6 G) j( e# P$ a: A' P8 b          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针6 k- P* Z0 S1 {0 s, A1 M; }
          addrlen:常被设为sizeof(struct sockaddr)
8 h$ S6 v* A9 W( {9 [* O" I8 L+ q. N  |9 V. U& s" y" U1 ]0 M* ^6 h, i
    3 connect()
8 X. v. M5 u9 \8 ?       头文件:
4 k% c1 U; m* {; |: \, q/ O! h       #include <sys/types.h>  
( D% T; w1 ]6 h( C5 I       #include <sys/socket.h>8 l# w+ l; I: A- e) e, x! n# d
       函数原型:
& i" b& j& I/ {7 Q       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
+ f. m! ~7 q8 y1 l           sockfd: 目的服务器的socket描述符
) E, w( \' D3 r/ F6 w           serv_addr:包含目的机器ip地址和端口号的指针. y* b: }: p: v- L/ O0 B2 A% d9 C
           addrlen:sizeof(struct sockaddr)3 ?; `5 L5 _1 ]2 ]' V) l
3 _! T' L+ w3 G2 u, j0 n) e* r6 y
    4 listen()* g. E4 J! B* M6 y9 i/ E, L: _
       头文件:9 S$ J1 t' M& D# f  R/ f
       #include <sys/socket.h>1 d6 Z' J8 X/ E
       函数原型:7 ]9 F" c5 q* q: M  j8 a
       int listen(int sockfd, int backlog);
0 w& C- `+ C* b% E2 ?9 {: ?           sockfd:socket()系统调用返回的socket描述符
3 s. d: N" b2 g; }% `, ]           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。3 P8 B" i+ g! N

+ w+ k  Q7 A+ M: h    5 accept()
( \+ n0 n6 \. t' Y2 u       头文件:   
1 B0 J3 z& a2 |( ~) C       #include <sys/types.h>8 Q3 k; h! k. ^7 w
       #inlcude <sys/socket.h>$ f  U6 O) t5 b
       函数原型:# U1 Y5 q4 B0 l1 Q1 d5 L1 W# c9 y+ n
       int accept(int sockfd, void *addr, int addrlen)
' @# [  I5 j' ]8 X; E1 E( Z' D% q) N  q           sockfd:是被监听的socket描述符# t* ]9 A6 Q5 T" S
           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息2 ?8 |  a" z- g/ v# b; _" w* K
           addrlen:sizeof(struct sockaddr_in)
9 }0 t9 I8 y, O" F, B6 c      
& ?7 K" ?7 I4 [" E    6 send()
; l5 V0 A' z1 s" W8 A6 G9 f        头文件:$ I+ K/ [) O& }9 N- ^3 _
        #include <sys/socket.h>
+ K3 f1 o* \. f( I1 p        函数原型:* F) Z' P  a; _' T& V3 _3 K9 X
        int send(int sockfd, const void *msg, int len, int flags);/ s' C! N5 v$ t
           sockfd:用来传输数据的socket描述符
/ n: X& t( m4 ^6 L6 d# X4 `           msg:要发送数据的指针
9 J6 R% P2 j5 o/ O% p           flags: 0: a. |0 o0 v( \/ g: r% O5 ]
      
5 Y3 N/ F/ r8 D$ f5 u2 e: F2 @    7 recv()
, H3 L8 y: Q& X: ]9 O        头文件:
8 \' x& B- [6 }6 P5 a        #include <sys/types.h>1 a- [0 j3 d0 p! E! @" }. r5 L
        #include <sys/socket.h>. f+ s' c" a5 P+ u4 H
        函数原型:
- e" w2 G5 r; q" I6 z$ o        int recv(int sockfd, void *buf, int len, unsigned int flags)5 i  R1 V6 K7 w  u$ i
          sockfd:接收数据的socket描述符
+ Q2 U2 V3 Z: @  \% E          buf:存放数据的缓冲区
* C, F% w4 o( m1 }. B9 w3 t          len:缓冲的长度
/ I9 C; A4 C! w, y7 I8 u6 z* [          flags:0
5 n. ]& x& d+ `2 T$ x1 {; s& }) m
    8 sendto()
- ]; i' `* n3 Y. g) ]" |' d       头文件:5 d' m* Y5 z0 ]: W2 B0 b$ u3 E
       #include <sys/types.h>
+ r) f% p( o! F       #include <sys/socket.h>
4 M9 R4 V' b/ ?5 u6 Q8 f8 A0 P       函数原型:8 M3 t- j* u6 t5 B7 w/ [- O
       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
3 `. E& A( j, b5 J        
, ?2 e- I1 V, S! r; [   
5 I$ h1 R# K: _5 K6 k4 N    9 recvfrom()( G2 N/ S2 P& N$ T$ u5 P& D" }! E
       头文件:
- B) E3 @, q6 z" i5 d+ O& K& L       #include <sys/types.h>
; Z2 p8 W: r, q       #include <sys/socket.h>
) [2 ^1 I5 ?: d: }' ?       函数原型:
7 s4 D7 j0 [3 M* B: N! }+ d8 K       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)$ D( R2 k/ N& t' y
  F9 m1 G7 q; J5 ?
    " w  _5 @* y' [7 \9 D1 d
    10 read() write()$ o& z2 g+ w$ |; I+ s
       int read(int fd, char *buf, int len)
* U# _$ V* F7 g+ p% D% R0 ?9 R- n       int write(int fd, char *buf, int len)
# p9 `  D" L5 h  s      
, t) R6 Q' ~+ U1 z    11 shutdown()
/ k0 ]7 h$ P9 g# L$ K3 z$ S# G       close(sockfd)+ U. B3 ^0 W2 E  D% o4 C
       int shutdown(int sockfd, int how)0 \8 m8 j! r0 `0 v9 T# }) N5 |2 e5 F
-----------------------------------
[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等)   ) [8 K( a; Q8 b. ?
<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
, t8 Z# V+ N: W5 W6 ~! `3 u<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()
8 f# U$ X, x0 z+ Q. ]: m<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等( [/ X  _5 f( b5 i
<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等4 D; X7 b+ {  `8 a) N9 H/ {3 C  @
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等
! c3 R7 H5 {# W<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件6 @! a# x/ r9 F! a# Z$ a8 I3 K

! Y1 [% t, @, b/ y. h[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等
' e- \7 O; Z4 H/ e& {  [# {#include <sys/types.h>      * n7 f! u1 ?% A6 D: M2 b" q
' y" i2 c: Z9 q3 F- P$ x
#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons, i" |7 s' q! f. G( I0 ^, A$ q7 O3 B
#include <poll.h>             //poll,pollfd" a1 |& H8 q; m* i+ g+ q
#include <arpa/inet.h>   //inet_addr,inet_aton
$ B3 S% X) z; |+ h" K; t/ T' Z4 Z) R#include <unistd.h>        //read,write5 t1 p6 U. M/ i/ d; x) D: M* }
#include <netdb.h>         //gethostbyname
/ J! Z3 f& ^3 @& K# f2 {+ n: Q5 |% c8 T+ Z
" _& s5 S# N7 K* l#include <error.h>         //perror# O& z! U/ K6 w' L* w9 d$ `
#include <stdio.h>& H. q- d8 t" V4 A) @- i
#include <errno.h>         //errno0 f+ q6 {, j. ~% e  V/ l" P( I
: W  a8 N* d" H
#include <string.h>          // memset' I6 n  X0 Y3 e: S. V$ g" L* T
#include <string>  l" a# m, g( F$ V4 R$ V7 _" Y. G
#include <iostream>
, ?7 P, P9 ?4 D. l
1 B! I3 H7 b* l





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