cncml手绘网

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

作者: admin    时间: 2020-5-8 23:01
标题: socket编程需要哪些头文件
[size=13.3333px]一 三种类型的套接字:
1 v; k+ ?* [( q7 k, D1 U% G, l1.流式套接字(SOCKET_STREAM)
* E2 d. B1 N6 T6 q" e    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。
! Y; s1 g" r4 W# F+ k- l8 z2.数据报式套接字(SOCKET_DGRAM)
% p7 F+ L+ I% ?7 O    提供无连接的数据传输服务,不保证可靠性。
+ f. \- Z! ]( d0 }& X* \3.原始式套接字(SOCKET_RAW)
4 }2 S- o6 J0 ]/ V; d    该接口允许对较低层次协议,如IP,ICMP直接访问。
8 ^4 U. S$ g3 ], ?& E0 U$ W
! t/ ~' _2 b1 z6 x二 基本套接字系统调有有如下一些:) `5 M# K9 U" f- Z
    创建套接字: socket()4 A2 d2 A' B4 |! p5 C/ I
    绑定本机端口: bind(); g% N* y/ p/ k% E( {/ p- ]
    建立连接: connect(),accept()
, U' O- |! N" A7 c5 A) v' r, ?    侦听端口: listen()9 L5 Q7 a1 t& R# O% ^
    数据传输: send(), recv()
# l* h' L3 D2 A. ]9 I# ?    输入/输出多路复用: select()
: L, U8 i; D1 X    关闭套接只:   closesocket(): B. }0 \3 k1 k: ]- m
   
! Q8 o( _. F. ~& i$ }三 数据类型) X6 D" w3 v$ G% |/ F6 l* @4 H( i
    struct sockaddr
9 Y/ p% l! l5 r    {3 d: y" I/ }9 m- c
       unsigned short  sa_family;   //地址族, 一般为AF_INET
( y5 w' q% Z8 F! j# A       char                  sa_data[14];   //14字节的协议地址; Q" y8 ]& @5 |4 q7 j% v
    }
* k- u* f/ d8 K+ P% W) T+ f
. h* K9 M: h/ \$ Q    struct sockaddr_in
+ L$ j5 I! S/ q1 C- C" g8 @- R    {
5 P8 t$ z& ]5 Z2 t$ n       short int                     sin_family;   //地址族
, A2 c; @1 }/ k, e: g  T       unsigned short int      sin_port;      //端口号
; r) F, S. I" J  u( N' T+ ^       struct in_addr             in_addr;      //ip地址" D3 G0 v' c, _! F5 s+ Z5 }
       unsigned char             sin_zero[8];  //填充
' B3 d- A( P% c    }/ x) s- c. h3 x
. {* ]  U6 \: C$ K6 y
四 常用函数
: j+ M9 Y1 u2 F. A2 V% q7 `7 ]' i- q    1 socket()
( @/ X* }- X0 C% v2 y! H% a       头文件:
  n8 v; L5 U9 G' f  ]% A       #include <sys/types.h>
6 x/ |/ n. \+ T5 [       #include <sys/socket.h>7 [& u) N) S" @' [8 g. {' f
       函数原型:
5 L: s5 D) I5 h9 z# D2 s) W$ @       int socket(int domain, int type, int protocol)9 q7 `) }* E' t! h& N) n
          domain: 协议类型,一般为AF_INET
" w% N. J( k+ ^          type: socket类型
0 |  D- k: _! b9 h; @3 Y          protocol:用来指定socket所使用的传输协议编号,通常设为0即可
1 W4 q5 O/ f% A  }/ f2 Y6 k2 v; J4 j% u! y
    2 bind()
7 @; Q8 h: ~0 F* F& F+ x       头文件:
) a1 e+ B+ K( O4 ?) {! R# `. h2 _" ]       #include <sys/types.h>
8 C+ j% }) v/ h/ s       #include <sys/socket.h>3 t; ~6 D- E1 s
       函数原型:4 L3 R+ k. f! T3 i0 `3 p* ]
       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
8 G: F) |' O) x$ [; ~3 A          sockfd: socket描述符
: f' M; m& R6 p( G) G) ]* o          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
! D. ]+ i+ ~" w% J2 J7 r" A          addrlen:常被设为sizeof(struct sockaddr)- r- J( {. o7 u# z  _4 i, s
# D; q4 Q: r4 S; _
    3 connect()' T5 A6 X6 t9 M1 E
       头文件:# ^, {  r/ d3 i9 ~9 B2 {
       #include <sys/types.h>  6 C* ]- c$ V' W1 T
       #include <sys/socket.h>
4 F& D1 C+ a5 {4 R! V* J       函数原型:
9 Y( o; f5 O! }" t) r( F' a& N- f% }       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)+ k1 E; X6 F- n! n
           sockfd: 目的服务器的socket描述符
! `% p" e6 U# z           serv_addr:包含目的机器ip地址和端口号的指针( m& ~. y& M. p5 }4 o" B
           addrlen:sizeof(struct sockaddr)
: V  e: ^* [0 W; G, b, m1 c2 y! T" J) a# r
    4 listen()5 P4 k4 k' k4 R$ H
       头文件:+ l1 T- O3 k) N. x9 @+ h
       #include <sys/socket.h>
- \9 u1 t/ b; _4 \1 }5 _       函数原型:
+ B2 p: U2 ]2 C       int listen(int sockfd, int backlog);
0 W4 F: q7 p: j$ q- ^+ [+ X           sockfd:socket()系统调用返回的socket描述符5 x: n) Z% H5 W
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
5 O! L+ w  a$ P6 a0 `6 o* @4 k
; s$ ]' R# T1 h' D    5 accept()/ Z- Y7 c2 A% u$ R7 l; S
       头文件:   
( S8 M8 r: c  {% {: M, s: H       #include <sys/types.h>
2 c% O( y5 Y8 d       #inlcude <sys/socket.h>
5 q  m' Z* f/ o* H. W) J) t, F       函数原型:
2 N5 X5 Q, [( }- K       int accept(int sockfd, void *addr, int addrlen)
7 K/ L+ ~* q" t) ^% h% {; X8 d           sockfd:是被监听的socket描述符
. t# n! o" i% J; Y           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
0 G& z* K$ U! W           addrlen:sizeof(struct sockaddr_in); j$ J0 b6 W& k6 P5 k* a, ?
      
# [9 n8 O9 O, d8 k: B    6 send()
6 R, X6 r; O6 O. U) r. h4 P        头文件:
2 j' T( I6 D2 v  l2 D, H        #include <sys/socket.h>9 D) ?) X, X% D6 a* a7 O9 g
        函数原型:; t" d1 _& Z# W& G2 H
        int send(int sockfd, const void *msg, int len, int flags);
" d; W% P; `' @: @* I) E( Q           sockfd:用来传输数据的socket描述符9 ?6 A; `4 D" C: p( i6 q+ K/ a# O+ F# T
           msg:要发送数据的指针
$ G- p& M) m! W           flags: 0  |+ V( @3 Q' l7 \
      
" q3 S5 [: `  z! K: p    7 recv()) o  X2 j2 M9 s; g
        头文件:
  B9 ^/ e; @; I        #include <sys/types.h>( z' |& @# T9 K, |: q
        #include <sys/socket.h>; o- g) A6 f, ?- c$ ?
        函数原型:
9 u( H5 w, @# ^" i9 j! X        int recv(int sockfd, void *buf, int len, unsigned int flags)7 n( S1 d5 `2 p5 w+ T9 B# _
          sockfd:接收数据的socket描述符
& ]5 ~% a' E2 V6 K9 Z% M8 r$ E          buf:存放数据的缓冲区
8 b0 n, E( h+ W, X5 B! m          len:缓冲的长度
* h! h* y+ a$ H5 [          flags:0. t: G$ B' u9 t
+ I1 y$ P  ?5 M6 G' H: K! p
    8 sendto()  }9 v& W, a( `  r
       头文件:9 s* Z0 C( P; A# w4 K, Y5 ~
       #include <sys/types.h>
" `8 N& E% K4 [- i# [# D- i       #include <sys/socket.h>
& \/ E) x# |. T) }) M       函数原型:
+ n) w! r8 }* L8 A5 I) x       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);7 y' ?1 b% M$ {  m+ I0 G
        
+ r# r- N- ?  D) N   
9 Y! B; q9 Y5 N    9 recvfrom()" R* b$ M3 i8 }+ c
       头文件:
1 V4 v. g3 N8 @- v1 I- F7 s0 Z       #include <sys/types.h>
. X7 i$ M+ q$ {" X) p5 Y1 D       #include <sys/socket.h>1 o2 G/ E/ a9 f$ H1 W
       函数原型:( o5 T/ Z. E+ J) p6 i
       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)% Z- R  k) Y) T" I/ l# `

! ?3 e$ `$ o* p8 E2 ?5 A. h# ~   
2 [, E; D+ u! |* o    10 read() write()4 G4 _6 I( q* Z4 H! A
       int read(int fd, char *buf, int len)1 J: f! V, R! n0 }8 h) K: R5 `
       int write(int fd, char *buf, int len)6 V4 q- ^9 D1 V& ~/ i
       ( w& J' D, S4 ~9 F6 D3 B
    11 shutdown()
. S' O; O6 g- K       close(sockfd)
9 l; i) U+ z, s* ]5 [% v       int shutdown(int sockfd, int how)) ~/ {* n/ T+ O8 R
-----------------------------------
[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等)   
- ^4 @$ s1 }" c* s+ S$ G<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等' H+ w# J/ u" u
<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()
7 z* \8 b) A1 Q) |) ?<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
# J  q9 `( z7 h/ t<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等
. D' D2 W2 M/ x7 _% w4 ]<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等' y' z8 D4 v, F( [
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件1 r4 R$ s7 D5 A" P
5 ^$ C8 B( u* [' C
[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等
# p* N- I$ S% O7 W, N) m#include <sys/types.h>      
0 e5 u- e& ^8 `! m6 r8 v8 f4 I# E6 g8 ^
#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons
8 v) \% q3 x3 v8 x# b. [* v9 i1 `" ^#include <poll.h>             //poll,pollfd7 X3 ]" A2 i2 \0 }
#include <arpa/inet.h>   //inet_addr,inet_aton: k1 y% D% }( G# c# h
#include <unistd.h>        //read,write6 e3 c! E* _- J/ D7 t9 h
#include <netdb.h>         //gethostbyname
' s& Y! x. B% F5 M( X# ~: B( x5 H' a2 F
#include <error.h>         //perror
1 l  G% F* ]' D#include <stdio.h>
/ b: B* F( f9 B! N4 R4 V6 i#include <errno.h>         //errno
* }% \6 a5 m/ S. A  v2 U* i! q
4 t: N2 i2 E3 y) F; b#include <string.h>          // memset# Y/ @9 E! ~+ c$ |6 ]# g# K
#include <string># U( {% g. S" E; s1 ]" m/ U* |
#include <iostream>
  r0 T6 [$ I2 z" j; m* _

+ J* _, w9 E  P9 _! j6 V




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