cncml手绘网

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

作者: admin    时间: 2020-5-8 23:01
标题: socket编程需要哪些头文件
[size=13.3333px]一 三种类型的套接字:9 ?; a+ K$ i- s: O/ k6 ^( d
1.流式套接字(SOCKET_STREAM)
( R  ]6 V2 u6 z* a6 S" Z6 N    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。/ C/ }  J2 w0 C4 @; L3 Q
2.数据报式套接字(SOCKET_DGRAM)
( X; j3 ~( Y% \, X    提供无连接的数据传输服务,不保证可靠性。
/ [) C0 A/ e; @: A3.原始式套接字(SOCKET_RAW)- K+ d1 D  Z- H* {
    该接口允许对较低层次协议,如IP,ICMP直接访问。
2 L7 i0 M: p  @% [8 @( X! l! F- c7 Y
) _, S9 e2 i2 @二 基本套接字系统调有有如下一些:
. y2 R4 A& R9 ?9 |  e( F    创建套接字: socket()
8 I- e2 w0 t% t/ z    绑定本机端口: bind()" f9 a0 F0 u  t2 z, q
    建立连接: connect(),accept()
# a7 q. N4 p# D0 S% b% `    侦听端口: listen()" l1 u- p: S& h( ^! t
    数据传输: send(), recv()
7 P2 \# z' P1 w& ]9 U    输入/输出多路复用: select()
  f' l8 i2 r5 t# t& x    关闭套接只:   closesocket()# z! `; H  e- i/ `4 R
    3 l$ h; Y: o0 C& S1 E1 F
三 数据类型
$ d. u# W" W# b( W  D) H3 l! ]    struct sockaddr* ]' I' p- s: z, z, ~: u
    {
/ c7 R  i4 J7 ?2 Y) h       unsigned short  sa_family;   //地址族, 一般为AF_INET
* Q* r1 x4 Z* q: u: M       char                  sa_data[14];   //14字节的协议地址
3 I' H- Y0 H. G2 w* O$ ~    }
! G0 @- m( S7 }  A9 _4 K# X" Q0 Z: ]" I" ?
    struct sockaddr_in" F% e4 Z2 W  `# g8 D9 T
    {) ?; c- X; I# e1 `. c  j$ ^
       short int                     sin_family;   //地址族
/ A! i  h. g1 B6 S       unsigned short int      sin_port;      //端口号
8 j( [3 b  S1 C) X       struct in_addr             in_addr;      //ip地址* i- B) q' d& L* C
       unsigned char             sin_zero[8];  //填充9 R. t. M. o$ ^  I% V9 {' c8 e, E: t
    }" N% a2 B4 s# C5 g2 N

, e; \: W$ r& W+ W- D3 ^四 常用函数$ y+ r! H# A( n$ @0 w, n
    1 socket()6 \& {& R) l8 y6 l; F5 d
       头文件:
4 s# k7 T$ x2 |+ g& W, w$ F" `( S       #include <sys/types.h>4 ]8 S1 W6 }. V8 u6 V  A
       #include <sys/socket.h>
# K+ X# i& f  u' t7 _2 y       函数原型:( |& X8 C! L; t& G* D! _
       int socket(int domain, int type, int protocol)
: Z. ~% B2 ^2 z1 H" v          domain: 协议类型,一般为AF_INET
6 x: |7 x# E+ W( f          type: socket类型
  r2 O; U* l. u          protocol:用来指定socket所使用的传输协议编号,通常设为0即可- x5 V" r1 u7 G6 h; a" f; ]! D
  S. K2 Y0 R- y4 z/ \" f- B% F
    2 bind()7 \# l% D+ K0 f2 f$ q0 S2 P
       头文件:( W! t1 I4 L3 r5 [2 ^2 k" v4 V7 B" I
       #include <sys/types.h>; M2 e( Z; R& n* ]
       #include <sys/socket.h>0 E& O& e# d; m; i/ p# h
       函数原型:. b# D- a$ ]9 x9 i# N3 }4 I$ I
       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)% W& h7 \" f' H& v1 B  a: |+ e0 d
          sockfd: socket描述符
7 E3 x. H) h/ H" |. w! q: q& s          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
0 V+ _/ H( V6 y  K" |          addrlen:常被设为sizeof(struct sockaddr)
4 |) L- [' k6 P1 q% F1 R3 ~  a7 W9 ^2 t/ [$ S
    3 connect()
9 d0 n/ D) p1 X% |       头文件:; w1 T! T; r9 c7 x
       #include <sys/types.h>  
6 `- D$ g( o% V6 C$ [4 E       #include <sys/socket.h>
0 m) |" u* Y4 K% W9 x       函数原型:6 N6 j, ^+ p2 E" R9 [
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)6 N3 `4 s  k& E& X. J+ x( F) q! ]
           sockfd: 目的服务器的socket描述符
+ Z9 ]$ J7 m7 M& V  H           serv_addr:包含目的机器ip地址和端口号的指针
8 I! z" u9 k3 ^7 _           addrlen:sizeof(struct sockaddr)
; E4 [/ H" p; m
2 n% g& l- r' T7 T* n    4 listen()0 i3 B  M8 J9 P
       头文件:2 d( c& B, `5 H, T- C7 w, t. K
       #include <sys/socket.h>
+ l9 S. U8 z1 a) P# g       函数原型:5 ?- Y8 {8 ?" D' c
       int listen(int sockfd, int backlog);4 r7 w+ ~. y. Y; j3 J- x
           sockfd:socket()系统调用返回的socket描述符
+ b: @; o+ c! D0 t0 Z& Y           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
6 W& ]1 M: K; r. o" j' s
9 V  ?$ ]9 n, @    5 accept(), n! c0 M. q( U4 i5 q" X; |
       头文件:   
6 k; X8 a) z% _) X$ C7 ^9 n       #include <sys/types.h>' B- N$ r( n2 l4 W: r1 I- e7 B
       #inlcude <sys/socket.h>
& K/ F/ P5 Z0 ^+ J' L       函数原型:
; z9 D# H* u7 |1 D       int accept(int sockfd, void *addr, int addrlen)
* P2 j) U6 k1 T, k6 r: p& L% {; M& K* R           sockfd:是被监听的socket描述符
) o2 D& T7 o/ X$ X6 j# \& Q& E           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
3 x5 [) T, b# s% g           addrlen:sizeof(struct sockaddr_in)3 c8 h7 ]; A' }: y6 v* ]  q; {
       0 B( q# [1 U8 I7 _, q! }
    6 send(); |9 W# O" L$ h1 N1 x  `% S* z' M% K
        头文件:
! _" K4 O: u1 D" [# e3 B$ A        #include <sys/socket.h>
% N5 X; f) Y% ]6 [* i' X7 K        函数原型:' S2 h! L4 K2 E% L$ Z% d
        int send(int sockfd, const void *msg, int len, int flags);
0 g0 I% l# A7 j$ s& d( D           sockfd:用来传输数据的socket描述符
/ f: n, X3 y3 {/ e) n: S* u           msg:要发送数据的指针
% I; G- x9 W, ?+ ~- w3 w, h( ~           flags: 0. B! Z) r( N! v: I" ]2 ^- @( ?
      8 ^4 I& k' {, X. h
    7 recv()0 k4 s8 j' \( B
        头文件:1 w' Y9 D0 J2 q& J# I
        #include <sys/types.h>
+ c. P" O) R) h- N        #include <sys/socket.h>
9 o9 ]( y5 w8 ~9 k        函数原型:
' ?9 C1 Y' y) X) C  C8 f        int recv(int sockfd, void *buf, int len, unsigned int flags)4 [. K% {2 i: b
          sockfd:接收数据的socket描述符
7 y, p# F2 E- i( ]' a          buf:存放数据的缓冲区/ R, ^& p: [5 ^9 A! C; Y' m
          len:缓冲的长度5 y! }% x! C( H9 W( s- ?5 F8 \$ U
          flags:0% n+ c& Y9 D- e
- _. ?: e5 V% C% M3 ^! ^
    8 sendto()% i6 C' M& T) F: L
       头文件:/ c9 Y. p8 q8 i) X
       #include <sys/types.h>
7 ?; M. a: }1 X! n8 p       #include <sys/socket.h>6 ]  d: k7 s, X( m) U
       函数原型:
8 q" x* b8 l* k  v% Q1 s  }, r' P       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);" f5 {% f# h9 F1 P3 J
        
; g: l* D+ _# x' }1 W   
) O. L$ s6 z- z' q    9 recvfrom()
* Q" J( b* W. E5 u& g       头文件:5 e, g& u8 d9 B. ^" q
       #include <sys/types.h>
0 T( b. K) ]8 n+ ]       #include <sys/socket.h>! a; Y# E5 T$ u1 ^- S: O0 W9 z
       函数原型:" C1 y, b% o* e1 g4 W( A5 t
       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
/ R; D6 ~2 L/ i; h) B4 o
# Z! i4 Y' o# y  l0 R8 @    ) ]& ?$ U9 _2 J+ M* h5 j2 E
    10 read() write()
7 @* A# j' s* r5 T# N4 j       int read(int fd, char *buf, int len)
& R. @2 e" N: @; T' |, `; g       int write(int fd, char *buf, int len)% q' [0 t0 _9 t& Y
      
: z& p, u5 p4 R7 `    11 shutdown()* C- A$ N3 f  t* p. C( T, X5 J3 i
       close(sockfd)
8 P# m6 v$ z8 K6 r& \8 _  h- ~       int shutdown(int sockfd, int how)% f  ]7 C+ X6 ]3 b
-----------------------------------
[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等)   
' O7 V. |' u! j" d' v' n# t, F6 }<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
8 Y/ \7 V- Z4 C<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()
$ d, l/ O1 y2 x  r' ~<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
2 t# r/ p9 w/ m: l! u$ Y<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等5 X. s1 ^; W( ?5 a' h
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等% |( p$ C7 D5 H: N% ^  G; R. e, G
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
* T& Q& T. m& W- H* w' ?2 i5 Q. d9 r" e$ k+ v! C; H
[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等& K& I! W5 n$ K  t! o6 h, U7 }
#include <sys/types.h>      : `7 z) N  B, ]5 r( M2 M5 ^& J, f

# A' W- s" W3 {! W! e, f: ^  `' ?5 \#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons3 p# f3 P1 x2 T5 M' O. n! c
#include <poll.h>             //poll,pollfd* a  t( X4 e1 ?1 }, n' y# ?) y
#include <arpa/inet.h>   //inet_addr,inet_aton3 m* k. j4 {0 \& j5 N- ^/ r! J% Z' B
#include <unistd.h>        //read,write
* r# V: `; q) `#include <netdb.h>         //gethostbyname
/ L" b) a+ L2 Y0 R. w, W' m( Y
$ a* X( z9 A3 q$ J. g- H#include <error.h>         //perror* L4 m9 J# D8 T) ]; k
#include <stdio.h>
6 F. X8 ?& a0 X0 ~( L' `4 o#include <errno.h>         //errno9 W$ ^& G  B9 V. W  P8 ?; b8 G, {' n  B. |

0 z3 W7 q: N/ \7 B#include <string.h>          // memset
1 L( Y. h; U+ m' d3 y2 U#include <string>
4 R! H8 U9 u, Y5 \- |#include <iostream>
2 g: B+ J. I9 W5 @

! J. f: G* P0 E4 r: B




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