cncml手绘网

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

作者: admin    时间: 2020-5-8 23:01
标题: socket编程需要哪些头文件
[size=13.3333px]一 三种类型的套接字:
" H& v+ R( A# l& n1.流式套接字(SOCKET_STREAM)! G1 e4 g& m  Z0 R2 y( h
    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。( O) j. f0 w6 q. x; i& H
2.数据报式套接字(SOCKET_DGRAM). M! u. x4 s5 \/ Z
    提供无连接的数据传输服务,不保证可靠性。  ?8 t6 ~" e) e9 ?9 M& D
3.原始式套接字(SOCKET_RAW); O6 b3 Z! \/ a, y& t" U9 v
    该接口允许对较低层次协议,如IP,ICMP直接访问。7 X2 {1 i9 `1 q3 J

% s; ~/ E8 S. Z( T2 U7 H( r! U- ?* j  p二 基本套接字系统调有有如下一些:
) ]4 U5 ?: q* @+ L  f    创建套接字: socket()
+ b1 B# N  u9 i    绑定本机端口: bind()
8 c' R0 T( v- C; A: M% `7 f    建立连接: connect(),accept()
$ {7 w, g) _0 M) ^4 y    侦听端口: listen()3 ^* |  \7 i1 D3 q
    数据传输: send(), recv()7 K# l4 J  v( F8 G
    输入/输出多路复用: select()8 F8 A7 |7 Y; C5 H) K
    关闭套接只:   closesocket()* a8 D8 A3 x6 E( v3 @
    * R" o* S) v0 S! g1 B
三 数据类型( T: I7 Z; G& E
    struct sockaddr! ]4 Z- }$ ^. h
    {
$ ~$ f8 Z3 ?, U" [2 y/ ^; l- B       unsigned short  sa_family;   //地址族, 一般为AF_INET
4 {' A: n. ~/ d8 j6 R       char                  sa_data[14];   //14字节的协议地址4 X* [/ M+ `; d# D& {! b1 p2 M& K
    }
8 b1 V6 ?9 T  T4 c6 X8 n
7 n' ?% a5 L+ i- i; z    struct sockaddr_in* @; P5 U7 G: Z5 z: b
    {
. P. H4 |5 h& ?: p       short int                     sin_family;   //地址族: r" q4 f9 U: N% F7 |+ v) s
       unsigned short int      sin_port;      //端口号3 A) g- R5 G" |- o: ]4 ]' o  X/ V
       struct in_addr             in_addr;      //ip地址- ~4 o) _  O. P7 F
       unsigned char             sin_zero[8];  //填充
* D" @8 z0 \5 ^. }    }
. |' s, ^% w% c& u3 }; f
6 D* ^( r0 z5 a. _. t4 s四 常用函数# N0 W& U" g" W, X2 E! P
    1 socket()3 U) P0 w0 U7 p7 p
       头文件: 2 q& s+ t; i1 m7 M$ {5 U
       #include <sys/types.h>* V! E& \: Q+ L9 n( H, u1 ^
       #include <sys/socket.h>
; B9 J( n$ l& U6 k4 |; Q9 |  n       函数原型:
+ }9 L7 D( n' V6 |6 }' Z5 f6 }       int socket(int domain, int type, int protocol)) V7 _6 F" ~' W. }! z" Z7 Z
          domain: 协议类型,一般为AF_INET
6 j- R2 V4 C2 z. D; s- b% S          type: socket类型
) X5 W7 K' }. o5 Y+ O, w. ^          protocol:用来指定socket所使用的传输协议编号,通常设为0即可
: P8 J$ e7 t! x- ]  K! P% {6 ]! \- N' a/ U- S" j% z: ~; m1 I3 U
    2 bind()
5 y$ p$ D9 a3 e, s) T9 ^6 a; [2 h& a       头文件:9 U) a9 S; D: z# }0 g3 ^0 r
       #include <sys/types.h>7 N1 r. e( L1 ~9 G1 S) d7 w
       #include <sys/socket.h>
' g8 F; Z% [+ |4 k6 ?& i       函数原型:. Z" F) t! P1 K8 S, @% Z. z: C
       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)$ w2 Q" y+ |# U* R3 p
          sockfd: socket描述符
1 T/ C  O; Q2 C7 q( p8 i          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针3 a4 k6 p7 k: d# o7 G: o9 V( e
          addrlen:常被设为sizeof(struct sockaddr)
# ?8 z2 z) A. s
  q- v- z4 Z* C7 Y7 m/ w, g. l    3 connect()
# v3 o# C0 y0 t. v$ |       头文件:
+ Q0 r4 w* }, ~6 k       #include <sys/types.h>  
/ N1 S$ f/ H" m& w% n8 i       #include <sys/socket.h>( N. T' f2 q' ]* Q, ~. z' w' V; e
       函数原型:/ E& t- C% q# o1 k
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)9 C; f# ^; c+ L
           sockfd: 目的服务器的socket描述符
  C7 L2 H& P  V: \           serv_addr:包含目的机器ip地址和端口号的指针
% @8 O0 J& ^7 e; A; @! u1 g" C9 y4 F           addrlen:sizeof(struct sockaddr)6 v2 z  Y7 O' N4 |% v; x9 H3 M
  p, M& ]2 R! p) q
    4 listen()5 o* i- E" }( ^/ w
       头文件:0 ~7 t  ]* S% b! h% |0 P4 I) W
       #include <sys/socket.h>: D! H' h4 K' G0 a( K* O* s* @
       函数原型:
7 Q& {4 o# G3 A  R8 z$ h5 H3 b& g       int listen(int sockfd, int backlog);, ~7 n; _, O; T: o# ]1 B( C
           sockfd:socket()系统调用返回的socket描述符% {/ z, b$ J/ T& C/ g) E/ K- N
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
' `! B5 x, x0 B: X0 M
  ?1 ?" e; \* _/ w    5 accept()
, ]% _6 d2 r; I6 u, D0 E       头文件:   
- l% V# U. u  S! k' p       #include <sys/types.h>
, ~- q( H! C/ |+ [       #inlcude <sys/socket.h>
  L$ p! \/ N1 u       函数原型:
- X' O: ^' f% S. ^8 A; g& t, V       int accept(int sockfd, void *addr, int addrlen)
& q/ y, j% V% v+ {/ V; D% ^           sockfd:是被监听的socket描述符1 w8 A" O, k$ ?* v: u
           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
( L! E; j% k, ?. C8 I  |           addrlen:sizeof(struct sockaddr_in)
( k0 ?, P" y. {, L6 Q- a3 N       ' W& e0 @8 O/ Q& @+ U8 ]8 L
    6 send()
: x. m; w" F& m        头文件:+ ^& y0 \, |9 d# ^1 K/ x
        #include <sys/socket.h>
% y$ r, _. j9 s6 `! @# a/ p        函数原型:
, n$ W! O! f4 o( i+ k        int send(int sockfd, const void *msg, int len, int flags);6 J: c" o9 D/ p% `: o
           sockfd:用来传输数据的socket描述符$ }, k& j& f6 A  _5 I( e7 Y% t
           msg:要发送数据的指针 & M, J% a; ^% {- O; [$ r  I' X2 q
           flags: 0. t  R8 r- c$ H6 U& ^4 j$ u* ^
      6 z( K' T$ A- M) j9 G
    7 recv()$ R% j2 v! L* R$ i+ k% C$ R
        头文件:4 X5 e& O. v/ s. u( K1 l% X
        #include <sys/types.h>
+ {3 z5 t. |, k9 z" ?$ K: q        #include <sys/socket.h>
* B% A6 a$ Y1 B  Y5 e5 f( A        函数原型:, |/ Z" x5 l4 {
        int recv(int sockfd, void *buf, int len, unsigned int flags)* W) h5 f6 ]- l
          sockfd:接收数据的socket描述符& b8 s; a+ d. Q+ L9 O# D9 L
          buf:存放数据的缓冲区
% Q2 ~, E& |7 q( i- n          len:缓冲的长度& U# x! P: f6 {
          flags:02 T) H5 E  ]% S: C
8 E7 I* _9 s, m: D' Z3 L
    8 sendto()5 {3 i) p& h2 p) l+ _8 x
       头文件:( x% [3 u( R8 D; J0 l2 V/ Z# x
       #include <sys/types.h>
5 n% p8 ?$ \$ a; M0 S6 C       #include <sys/socket.h>7 f( \# x& {" f6 ~/ y& _
       函数原型:
& U0 G4 b% G' \       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);! G. |/ B+ Z3 `5 G/ Z
        0 g* k4 U" t( z: @1 [! a* ?0 V
   
# ]. A- m' c  Z( F: A    9 recvfrom()
- q& `" B( ~5 Q  G6 {3 j       头文件:
6 f* U3 A# o# Z' W+ y) c       #include <sys/types.h>  a# p- w) K  T  R5 q" c" [; [
       #include <sys/socket.h>
3 m$ h$ j9 h9 G5 O0 j; n2 a% d       函数原型:8 E& M4 E" Z; ^6 z0 B
       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
3 C  K2 b; W) `; Q. G5 R. w. V" u5 W$ s) @% |7 ]6 X
    # x, A4 h! B+ _
    10 read() write()6 b# L: @& `9 l0 u1 e0 N4 D
       int read(int fd, char *buf, int len)
6 X% D5 v; T; W* v' w       int write(int fd, char *buf, int len)
) |6 H! \3 i' v) L' L+ P0 m/ b" W       9 D2 q8 b) T, G. C) [
    11 shutdown()
+ O, p0 m+ i9 h" x' B, U       close(sockfd)
8 w, Q7 _3 u$ w- m8 n; I       int shutdown(int sockfd, int how)
8 y5 @. J  A: l0 D- K-----------------------------------
[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等)   
# X; y% ~* x/ f<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
/ f4 \, G3 ~2 ?) i: ?- w6 y<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()  [: S7 l5 Y+ W* d! Z6 F+ g
<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
3 q; @" \9 D" o& ]$ E<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等9 R! L; h# s; B: A0 g) @
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等
% E8 B+ T0 \1 {: n5 p5 T2 S8 K+ H<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
* h9 F" A. J' ^1 u0 B- z/ _3 w* Q
[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等
# ^; q  h) |' D. O3 h+ L* @#include <sys/types.h>      1 }8 G: L# N( n! `( |& n

+ n8 c0 q% w8 `#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons
( ?+ Y% U2 _6 a; G2 d* E#include <poll.h>             //poll,pollfd
/ @2 l  h( w( _7 g+ o#include <arpa/inet.h>   //inet_addr,inet_aton, N1 n6 s7 ~. B9 L& S4 m
#include <unistd.h>        //read,write
1 U3 n0 L7 U; y#include <netdb.h>         //gethostbyname6 E7 ]5 u, T2 j3 j, l/ _
' b7 z5 V: c9 M0 Q4 ~* C: }  E
#include <error.h>         //perror
6 y  r% ?; w9 |#include <stdio.h>
1 T2 r0 z- p3 [% w1 o% W#include <errno.h>         //errno( A4 Z* ?0 G! g5 o; E5 b, O: H
& H' k5 |+ J8 X6 q
#include <string.h>          // memset
5 K3 P1 `8 L+ g! o#include <string>- F$ \: o: U. E5 k2 m
#include <iostream>

  f6 e0 J( d; q+ E* j
6 Z* D& w' y: x1 G3 L* \3 g




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