您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16449|回复: 0
打印 上一主题 下一主题

[C] socket编程需要哪些头文件

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:; k7 f$ `4 |) u8 y
1.流式套接字(SOCKET_STREAM)
& j6 }  G# d- h6 ~7 N( Q8 ]; `    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。
% \& W" u3 X; H: m# B2.数据报式套接字(SOCKET_DGRAM)8 g" J+ M3 c& b) O- l+ p
    提供无连接的数据传输服务,不保证可靠性。
. p- t2 i8 q- R8 K+ g: U3.原始式套接字(SOCKET_RAW)) P8 x8 }1 w5 }4 b' S9 ^
    该接口允许对较低层次协议,如IP,ICMP直接访问。, D3 l* j" E, }7 `9 d: \% K

( X: Y" E5 l. M  W* h0 W二 基本套接字系统调有有如下一些:
3 J6 ]1 C: {5 s    创建套接字: socket(). [* D  e- z9 b- _0 Y
    绑定本机端口: bind()
' X2 @1 x+ R0 @    建立连接: connect(),accept()
# T* q9 \. U* a( U' P1 C    侦听端口: listen(), [, O1 h& z1 h' i
    数据传输: send(), recv()
( a& O. s6 R7 i  f+ D) a7 s    输入/输出多路复用: select()
$ p1 F. {" P/ D& g- f* w    关闭套接只:   closesocket()
8 x; U/ K9 S! @6 M7 l    ! ]- t: V* j4 ^5 u
三 数据类型% K; z# c1 U" [8 o4 ^2 R9 V
    struct sockaddr
# B# X7 A- p$ h  X! @$ z    {8 P$ l+ _1 P: P8 ?& G% D; w
       unsigned short  sa_family;   //地址族, 一般为AF_INET& U; Z' P. K. k8 A# S; z
       char                  sa_data[14];   //14字节的协议地址. Y+ @5 Y& f9 L% w! B  O3 X% @/ Q
    }! ]0 v* ]! V. I% r

0 H! _& N- @: ~# _) z7 m& I* G1 A0 }    struct sockaddr_in
- V( d2 y& Z6 z# B    {" n  L% h+ N; N# Y: M& k; k3 A4 V
       short int                     sin_family;   //地址族" T- W, l/ o7 G
       unsigned short int      sin_port;      //端口号
. p- t; D8 E/ w1 B- `       struct in_addr             in_addr;      //ip地址" o" y; R9 E7 ~1 f0 G
       unsigned char             sin_zero[8];  //填充2 E  p9 C4 j0 K- z% U, g; ]
    }
1 i% o7 }6 ~/ K; N1 R. @
5 D: C; |3 b* I& K6 Z: E四 常用函数5 ~! j9 u# n3 S* w; U
    1 socket()7 y: N+ P0 M$ d4 u4 y) P5 M' D% M* b+ e9 i
       头文件: 4 J% v6 E5 a7 _- ]
       #include <sys/types.h>
5 w& @  e% Y+ p- |! A1 C. S) Q       #include <sys/socket.h>' r, i5 [# P/ f% o/ S
       函数原型:
1 O( H+ P7 X8 K       int socket(int domain, int type, int protocol)
0 `5 B' y: Q$ F: b# y0 i9 {          domain: 协议类型,一般为AF_INET
3 D" ?, O" U+ N! L          type: socket类型
4 w5 s. y) _  W5 a8 x0 J3 v8 }& e- i          protocol:用来指定socket所使用的传输协议编号,通常设为0即可
9 m0 ?( a1 [+ p. |$ e/ W) c7 ~) J% p* X* G
    2 bind()# D6 l8 {8 V, v4 U2 O' c% F1 x9 O
       头文件:
; a! r3 J( }4 _! M8 s       #include <sys/types.h>
9 x5 A7 G$ V2 k1 q% d' i% g' ^       #include <sys/socket.h>
2 T; R1 e7 G% F; b. j6 z       函数原型:- I" c# k4 O' O. ^1 Y1 K' v
       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
8 i2 s# l' t! s& p) q: ?          sockfd: socket描述符0 m1 s% ]& j* ?# D" [& S4 r
          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
: c7 i) [) S5 K$ a' d; X          addrlen:常被设为sizeof(struct sockaddr)
( t; p2 M) z- {7 c( t
9 X% x: J+ ~# S/ p8 K    3 connect()" Z, D1 h+ f8 t9 R7 S
       头文件:
. d8 v3 F' n4 q! n1 V       #include <sys/types.h>  
. U9 N2 m; D9 l9 B; `2 d' @% n6 u       #include <sys/socket.h>
1 x6 |$ ]; U+ M5 r       函数原型:
# G+ \. y0 q9 y) c% |, c       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
! J( v2 _3 x: V; Y( V% ^8 u2 F           sockfd: 目的服务器的socket描述符
  j3 _: n, M) Z, d9 P           serv_addr:包含目的机器ip地址和端口号的指针; r& K' q0 q, _5 I* u0 N
           addrlen:sizeof(struct sockaddr)
* @0 d8 }" o9 a) V- O0 k9 A1 S6 }3 ~; w
% E( V& i( V4 T* d0 H    4 listen()
" W! u% K8 q1 ]) x       头文件:
: |. `' d9 |7 P! s/ L       #include <sys/socket.h>
1 J7 l3 o: x; M( S0 H: S       函数原型:+ F& \2 n0 q+ I+ Y' `  Y; K# _
       int listen(int sockfd, int backlog);4 z' L; S) W: V& b/ }" v6 W$ H
           sockfd:socket()系统调用返回的socket描述符* l2 l. k3 H" n& D4 v- |
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。" k; V  N' f  m6 p8 [

* g. p$ o( [3 i, b! p4 s    5 accept()) Q! l" `, J" e8 n5 T1 x
       头文件:   + W! v/ Z% V* X9 i9 n1 D
       #include <sys/types.h>
: ~! T: g, |3 [, i' \# F       #inlcude <sys/socket.h>
+ B6 y, R+ F$ e0 j1 f; I       函数原型:
" [' ^! |" u1 _9 M) i+ B8 J) k       int accept(int sockfd, void *addr, int addrlen): \$ j3 k' Y0 D, Q8 Y/ b; Z
           sockfd:是被监听的socket描述符
& D) [, u, O% O* ^8 o3 G" c$ j           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息9 F2 c7 P6 s! N+ G4 K$ I' Q" L
           addrlen:sizeof(struct sockaddr_in)
3 h8 R  l0 Z- q% r7 Q* g- }, T2 i; Q      
! q! W, o5 {% s- ^    6 send()) v+ y8 X% e2 N4 ~, b: X% t+ C0 h
        头文件:$ I' {% F4 P. Q) B: W; X! ?
        #include <sys/socket.h>% ?3 o; U, T- p% m
        函数原型:2 O* s, v$ C: b
        int send(int sockfd, const void *msg, int len, int flags);
0 Y7 x& A5 p1 B, ?* U           sockfd:用来传输数据的socket描述符
! M% X- ^2 d- m% Z4 K, a" ]           msg:要发送数据的指针 9 f' [- ^1 o  D. j& P: o, M% b
           flags: 0
+ q! B2 W3 C3 h. s# D2 [      8 s6 N9 l" Z2 G0 F5 }+ l
    7 recv()
1 S7 T- W+ X9 K7 T: g        头文件:
: X) ~5 [- o/ p* |9 z" K        #include <sys/types.h>
& A/ d9 R1 R4 t1 m* a9 _        #include <sys/socket.h>
  [9 }& P2 i0 v# R& Q$ V8 P        函数原型:
3 s5 L  r9 i$ O) x# h+ r! f" Q( S0 z        int recv(int sockfd, void *buf, int len, unsigned int flags). n) D6 T# D( y. m. g; h3 k8 s2 y
          sockfd:接收数据的socket描述符
& a! r) T% C  }8 v0 s' c          buf:存放数据的缓冲区
4 R8 {  Q, \4 ?          len:缓冲的长度
/ n' F; q4 ?: t" \8 k" m5 u$ ?          flags:0! b8 X% P8 x  A

7 o2 U) ]7 s4 b! _    8 sendto()
" G. c$ I+ n. Y+ q       头文件:% k/ ]- P+ q3 r+ P6 O
       #include <sys/types.h>
5 C  [4 ]) O" E5 \4 \3 {$ A. |       #include <sys/socket.h>) f6 R" y: B& [$ c1 @
       函数原型:
7 D/ r2 \0 p& W5 W/ w6 s0 R9 {! W       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);$ W. w. m- w- m' H2 }2 y- ]
        
7 \; p7 J# o0 h' \( L    & F: d3 g3 n  I  {1 z
    9 recvfrom()
" n+ p# M' \" f' c8 {1 W( l# [       头文件:
: _$ g2 Z6 V# }, O. ]       #include <sys/types.h>7 g+ C+ o' ~" t$ x; A$ ~6 K
       #include <sys/socket.h>
1 P+ d# c9 ]% t' S/ y0 S  Y5 q       函数原型:  {+ q5 y6 S- \7 g/ ^
       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen): @( n0 e- F% s3 {( O

" j8 r8 F5 N3 \: u: p   
7 A, g8 M/ S/ ?/ O' T# Z    10 read() write()
- ~5 I" W( {3 ^. t# F& u5 `* Y3 q       int read(int fd, char *buf, int len)) {5 \' q  ~$ Y
       int write(int fd, char *buf, int len)" t3 C/ _- d- Q, _& w+ t+ C
       5 Y# ^4 h5 ]5 E/ \- r
    11 shutdown()
# \0 u# P; p/ H5 ?6 C% G* f       close(sockfd)! c' C& c% u9 H9 @9 @# ~# x' @
       int shutdown(int sockfd, int how)
2 F$ G9 _1 j; w5 F9 A7 E9 M- O& U-----------------------------------
[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等)   
$ i" ~" O0 B' Z7 q' k<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
: {$ D/ o7 X5 c9 t<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()
; U5 B  v% L( C+ c' t& k/ l- E<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等  k' D  e9 F8 g* ~3 ]6 c9 {$ N& h
<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等
0 R/ W7 v& Q8 x* ^" {& J; {<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等
8 s$ Z$ N$ l" ?' A<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
- d6 K7 S$ V6 J! ?% f: C1 D% G2 v; ~: b8 O  L! h8 Q
[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等
; f! g8 ~5 c7 D8 d#include <sys/types.h>      
0 c/ d+ m; _" w+ ]/ {9 U- j
1 O+ e* [, h  y9 `0 q5 h9 N#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons
: @/ |( d: z9 w4 z' {+ E#include <poll.h>             //poll,pollfd
, d! n( V0 |1 a0 k5 a6 D7 V#include <arpa/inet.h>   //inet_addr,inet_aton1 w% Y, f# f. \% E! Z/ n% Y# D  I
#include <unistd.h>        //read,write( i! M- v5 ?2 k4 b$ [
#include <netdb.h>         //gethostbyname! ]  a5 ~! K6 E6 L1 N

0 W: o; ~( ?2 ]# n7 s% S, w/ Z#include <error.h>         //perror0 O" {" a7 x! v8 ]+ _4 h
#include <stdio.h>6 f& i+ Y  [1 G0 B
#include <errno.h>         //errno
0 _4 [* e- t4 V* @1 N1 K8 ?* @/ ^. S8 u" g: E
#include <string.h>          // memset# W0 c1 }4 R' j9 R
#include <string>( r4 h: h( h: ^
#include <iostream>

2 _! \1 q; c6 k( u2 m" j0 c& g
/ m! w7 K8 A/ Y' ~4 E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 02:06 , Processed in 0.058526 second(s), 19 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!