cncml手绘网

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

作者: admin    时间: 2020-5-8 23:01
标题: socket编程需要哪些头文件
[size=13.3333px]一 三种类型的套接字:3 ?+ K( S$ R& ?& h# m  G$ V
1.流式套接字(SOCKET_STREAM)
  t. \7 M! e  f. `    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。" U. e9 V8 g. ^8 C' U% V! V0 L
2.数据报式套接字(SOCKET_DGRAM)6 c- |; A: f# Z+ A5 X/ h
    提供无连接的数据传输服务,不保证可靠性。
. n) t# d9 S; }  k# x3.原始式套接字(SOCKET_RAW)
% p" S, y; ]4 k  S, ]: H    该接口允许对较低层次协议,如IP,ICMP直接访问。
5 Z: y: V& J2 Y3 X% Y# S2 C( N: R
2 L* C, @9 |% V, }. `7 }二 基本套接字系统调有有如下一些:
- \1 r9 N; f2 g+ b7 m( U2 z    创建套接字: socket()
* M9 f0 T0 {7 v    绑定本机端口: bind()  z# u9 W- i& T' b
    建立连接: connect(),accept()
2 R8 |& C4 Z, a9 ~4 P# q2 m/ T    侦听端口: listen()4 e, U7 y4 G& H# J, S1 [
    数据传输: send(), recv()
0 A& H- M+ C1 P    输入/输出多路复用: select()
% \6 y4 R0 K5 ]! ]) A& P    关闭套接只:   closesocket()- B2 h, d. h/ x7 ~
   
( `8 @  L' N2 b5 V# Z三 数据类型
, n2 ^- g1 e- V+ p6 [" w; i    struct sockaddr
5 u( Z* a6 b3 c+ L% h, H5 _# y, t    {4 A0 d7 M4 `7 f3 F
       unsigned short  sa_family;   //地址族, 一般为AF_INET
' ^: }7 ^# F7 D) ]3 F/ |  _/ b3 W       char                  sa_data[14];   //14字节的协议地址
, d3 D; [- p2 M3 `3 U1 j    }
3 K8 v; f9 G) {# R3 _" _
; X5 d8 V  I, A7 R8 h    struct sockaddr_in
5 j1 V; t, }& _! l1 f% H    {5 x+ x9 Z  B  R3 I+ I) ~
       short int                     sin_family;   //地址族/ }+ j, e) G+ p! }) i1 z) j! @
       unsigned short int      sin_port;      //端口号7 {8 x& }" x7 x
       struct in_addr             in_addr;      //ip地址8 d' i  ?  a; N- M* N' }6 W
       unsigned char             sin_zero[8];  //填充
, B: u2 C: D& G' Z    }
1 X" N0 F) H; p7 r! a# ~, I
7 y0 k' @& R* x, E. h3 R四 常用函数
. G7 C9 h" I7 I& i7 W4 L& [    1 socket()
, [( X! q" m( {9 m/ h! |       头文件:
: |! y, M, ~' w+ Z; m9 Z1 J+ x, y1 I       #include <sys/types.h>9 J/ n4 N: i5 ]0 b' {* H4 a8 P+ P' X
       #include <sys/socket.h>
! Q5 z( G+ D% t( ^/ [8 j) J       函数原型:' ^$ ?' l6 t' H* Y& w
       int socket(int domain, int type, int protocol)9 Q1 O7 S" o: X3 G
          domain: 协议类型,一般为AF_INET) u: H; o, U) m9 k" y. _" T7 d  f3 C
          type: socket类型+ X' x! e; X0 i5 ^
          protocol:用来指定socket所使用的传输协议编号,通常设为0即可# ?1 u6 j( F7 J" e" S7 {- b
8 y% I: U& D' z7 F0 e* u
    2 bind()
: d! M- F8 \, E       头文件:3 S2 Q/ _4 d' h+ Z/ K" f
       #include <sys/types.h>, h' |% T+ G/ @/ g# u+ U
       #include <sys/socket.h>8 D0 |4 K+ y* Y2 _6 m8 w
       函数原型:0 v" M% r9 k& g+ ^# `/ c
       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
, [% Z3 w$ M/ W$ Q, j# @4 t9 N          sockfd: socket描述符) |9 \9 o! A6 `
          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
% H4 \. a% ?0 g2 j( b, v# r+ H: G! H          addrlen:常被设为sizeof(struct sockaddr)! r6 r  \# q& N% \, H" {1 L
) i) V( A+ A; _6 f
    3 connect()) v. D! C+ J! `# O* P8 D) W: X8 v
       头文件:
4 \0 d4 a* @& E7 W       #include <sys/types.h>  
* P5 f1 D; K$ U       #include <sys/socket.h>
) |: {% Y* u# M! ~1 `' n) n       函数原型:
# A! j3 C" {, z0 T) n7 o       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)3 T2 l! l3 e( n1 n5 F# r
           sockfd: 目的服务器的socket描述符3 m) x0 C6 k" G  d
           serv_addr:包含目的机器ip地址和端口号的指针, @4 }; _, I% c0 ?7 L, i) A9 b
           addrlen:sizeof(struct sockaddr)
4 m+ P2 R5 _* y1 X/ j/ b% N7 r! E5 b8 Q. S, P7 q0 `
    4 listen()$ b6 |9 @0 }, g9 T' x* d
       头文件:
+ b- T7 A  y# R# ]7 J$ k6 M, e6 ~; A       #include <sys/socket.h>
# S1 v2 e0 W  Y# `8 o* P  O       函数原型:
& O# s: |/ C* Q& f& L. `       int listen(int sockfd, int backlog);6 J3 u! i- H  ?( D  g& L0 q0 o* t
           sockfd:socket()系统调用返回的socket描述符
* a4 T% t& R9 y; K' X5 H2 z, l) r           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。4 I$ \+ S5 W7 s& x8 m* }- u' n) N$ @- q

! q: M7 k" \  s4 I    5 accept()
5 V. U; ^* K% ?0 \6 G# A       头文件:   ; s- G+ V  R$ \" B% `1 L+ d
       #include <sys/types.h>$ [/ M4 P9 l; v) l
       #inlcude <sys/socket.h>, t2 o6 I/ m$ Y+ d3 |8 Q* x& A7 h
       函数原型:6 q# a4 Z2 \% h3 b8 {2 L2 {
       int accept(int sockfd, void *addr, int addrlen); R0 D# o" O9 G0 W! L
           sockfd:是被监听的socket描述符
0 B' k# C; M6 V% M* ]$ n           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息1 u; m# t& l. I
           addrlen:sizeof(struct sockaddr_in)
, |6 x: R: D7 D4 |       5 t4 m8 p" G- v% _# Z/ w, p6 ~+ [1 y
    6 send()
5 ]# ]& n. Q. @4 D1 N9 C        头文件:( s3 z, f- s9 G$ n4 \$ W
        #include <sys/socket.h>1 O( l+ ]' C/ _' r- W, g5 n
        函数原型:8 E$ M9 L% k3 T9 ?8 {% ?7 ?  ]; l
        int send(int sockfd, const void *msg, int len, int flags);
+ o5 \* s' Z1 t4 i) `' S           sockfd:用来传输数据的socket描述符) v3 D  O+ t  r# I; {
           msg:要发送数据的指针 " m; @: ]& F* g8 o9 L
           flags: 0
. w) u/ \! W& k/ ]: C      
* T& }7 M3 k/ h6 p3 D2 K    7 recv()8 r8 B9 [( }* w
        头文件:) F! z; E4 c' t% h  n' f$ n$ {8 B
        #include <sys/types.h>) i. J: j& z9 B$ k& ^: d
        #include <sys/socket.h>
, x3 L8 b3 X/ ^$ }1 T; g" k        函数原型:( ^! d# O9 I7 S' f2 a$ s7 [0 A
        int recv(int sockfd, void *buf, int len, unsigned int flags)* H! I/ C7 P# Z" [  c4 g: _, ?5 ?
          sockfd:接收数据的socket描述符* y+ B* V- a- D6 m8 S0 ]% R
          buf:存放数据的缓冲区" P8 I, ~7 I* n- N: a* o
          len:缓冲的长度
5 b9 z  [; Y& k7 \          flags:0
+ P$ z% g  H) R1 S$ J
. Q" ?3 S# G4 x: Y7 o9 E0 g7 H    8 sendto()2 Y8 k# o2 G* ]" g+ J
       头文件:, }7 |3 j5 {& y5 t" T9 k
       #include <sys/types.h>
. Z$ v( X0 G  ]( B7 d/ B0 n2 V' e       #include <sys/socket.h>
9 J  c" N0 X. |  q       函数原型:5 A9 G7 x+ b0 _) M
       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);# p; H# b; J0 b" A# P
        $ [% g3 {6 _, H6 ~! q
   
% m3 V: t" o- I7 t( T6 v+ C    9 recvfrom()8 A+ E# [! W5 ?3 E; g' U0 n
       头文件:
# O- S4 U$ G/ }) C3 x9 \       #include <sys/types.h>
  {7 |0 w; i; {       #include <sys/socket.h>
. {$ b; M$ g, @# u9 J' z4 o4 c, x       函数原型:
: V+ H/ z3 @4 |" T( `0 F, O       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
! F4 q$ t4 |, ^2 ?, F2 b
3 o: m3 B- Z' Q7 `6 }9 c- m   
9 e3 H4 K9 S; x7 y5 h8 ^/ n    10 read() write()
; W) s8 \, e, F0 W8 T: y; S0 w; ^7 g  J       int read(int fd, char *buf, int len)
! M1 s5 I: \  m. n6 k, a0 r: K       int write(int fd, char *buf, int len). G. J8 s: u: V
      
& v9 W! Q* l  G/ |" i9 ^    11 shutdown(): Y: ~$ v0 C- K" {
       close(sockfd)
0 h6 W# Y5 [7 G- s) ]4 z; ~       int shutdown(int sockfd, int how)
7 N& U  r- |, ?, U: i& E-----------------------------------
[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等)   
+ v/ A" Z8 q% Q9 e& r; V, b5 b<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
2 |) U6 P" ?' Q0 ]1 A$ ?1 z<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()
7 D! E! |: a5 t+ u, |' |<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
4 W/ e0 x8 v. `' q! M+ b( {! }$ L<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等
$ A) ^2 i1 e0 ]1 X& i$ @1 z<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等
9 D1 v: [) k0 f7 {, O<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
& g3 f6 |0 L$ j8 g
* `$ x' C9 n* J' |% ~$ z[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等
) y3 a- r7 _; k( L4 z#include <sys/types.h>      
" ?6 i+ [* J2 w. H  {0 @8 Y4 [, ^2 y0 r9 c5 _8 m6 p& s& x) k
#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons$ r7 r, t% L5 J3 X" B: c
#include <poll.h>             //poll,pollfd$ O2 M( f# ~1 ^. q. z8 b0 J- c
#include <arpa/inet.h>   //inet_addr,inet_aton
" O% c) G9 C- [' G#include <unistd.h>        //read,write+ {# O* r+ ~' x: w1 e* F: {4 b
#include <netdb.h>         //gethostbyname
6 {0 _$ ~9 s( d0 P; }8 G) h* P: a) H
#include <error.h>         //perror
7 G! y9 L% F5 T8 _) _% }4 d" f#include <stdio.h>
% ]2 L5 s- H" b, g3 [#include <errno.h>         //errno' w5 W# ^& d. j0 B0 U, B! X6 K% g
6 i- V# Y8 X) ]
#include <string.h>          // memset3 x8 M) W1 U6 t4 y) i3 q
#include <string>1 x! H/ _3 ~$ [/ R8 R
#include <iostream>
# A) E- G& l% ~( n

6 e6 i) K: F5 \2 m! G* z% M8 c  W




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