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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:
6 }4 Y3 e( Z6 N# z2 f3 X, P1.流式套接字(SOCKET_STREAM)' Z; l6 b1 B* U0 Y9 C. `3 S4 M' b6 f
    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。
2 ~3 a: m; d! P( s* {% U4 `  _& I( I2.数据报式套接字(SOCKET_DGRAM)
4 @6 g' L% z% S4 `$ z7 T* d    提供无连接的数据传输服务,不保证可靠性。
: i/ E. W1 ]- h. Z/ \* d4 V3.原始式套接字(SOCKET_RAW)' T+ W5 m' T- {! o, j1 D( |' p! K
    该接口允许对较低层次协议,如IP,ICMP直接访问。5 l- o+ R: k1 m3 g& e

2 p& A% f, [3 d- ?1 H- _二 基本套接字系统调有有如下一些:5 U+ f7 |$ ~& p% f
    创建套接字: socket()1 C. n3 V' v5 G
    绑定本机端口: bind()/ n0 D& }; _* x
    建立连接: connect(),accept()
8 c1 |3 H% X$ U& Q+ t0 y    侦听端口: listen()
: T; I$ z, g" n; J; X' f    数据传输: send(), recv()
9 j6 L4 m  o: `/ l    输入/输出多路复用: select()+ ]; R/ |: g  a" ?# X* J3 q
    关闭套接只:   closesocket()* }# l6 Y: b! |5 [0 Y
   
- _) w/ b& z; j! C4 N# A三 数据类型- u/ ]% d2 p% _/ d- `$ R
    struct sockaddr
8 Z7 m2 F& o. x6 {    {
% p1 V1 g! }: B8 E       unsigned short  sa_family;   //地址族, 一般为AF_INET
3 B" c6 a- E5 W       char                  sa_data[14];   //14字节的协议地址3 [0 P/ L% v: d4 ]  D' q4 ~2 M8 w
    }
* |* |0 g2 w6 G( m
7 q; \, l- F4 e4 G2 ^    struct sockaddr_in
6 P# m( ?# P- T& ^    {6 }5 M/ l0 ~" M! {' h
       short int                     sin_family;   //地址族/ |; F! x5 j1 ^
       unsigned short int      sin_port;      //端口号  c/ b4 P- R# {# B! c1 c
       struct in_addr             in_addr;      //ip地址2 X5 u8 v6 l) j! W' C) X& K
       unsigned char             sin_zero[8];  //填充" P. B5 S8 h" O' p) l% B" K
    }  v, |, ?6 q! B6 ?' k
) U5 H1 U2 M4 {9 o2 y
四 常用函数* r: u1 c! d; u$ X" S8 B
    1 socket(). v' u; ^0 \1 A- z1 w
       头文件: 3 p+ U+ ]8 v6 e' k; x9 W3 z, z
       #include <sys/types.h>, A5 n4 O/ h1 F+ _9 K6 N6 _
       #include <sys/socket.h>- m2 B5 `9 I( Y
       函数原型:
+ l6 d+ @' t7 Q       int socket(int domain, int type, int protocol)  J6 i# O! T3 E3 E3 i( ]
          domain: 协议类型,一般为AF_INET) u$ R& N% P7 y$ e
          type: socket类型
$ `# M! y: ~8 M& D. R+ ?          protocol:用来指定socket所使用的传输协议编号,通常设为0即可
5 ^. J. I' T) |
- }. \! a  d+ v0 N5 k    2 bind()
' q/ R/ j- A0 b, j4 P2 B# Z  p' f       头文件:3 [! a' k8 t6 G: e3 J9 \3 W
       #include <sys/types.h>  I( I0 L. Z+ t. s- q2 b
       #include <sys/socket.h>1 o2 r  q) o* [# P: q, Q
       函数原型:
8 H& S5 [) t1 a. }* m* x       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
2 a# c& i# _! f/ `  @; O0 v          sockfd: socket描述符$ X) \# v& V* @% Z4 x0 N9 q5 L
          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针; ^' i' D' g% q$ q7 V0 H
          addrlen:常被设为sizeof(struct sockaddr)
, @, n0 O/ o) K+ y/ \' v, \2 }1 {; P# N) H: i  |: J" s) m/ o2 k
    3 connect(). g7 Q' o$ Q, V% G, r+ }  R0 q
       头文件:/ j) r& K/ |; J, [
       #include <sys/types.h>  
  W. Z% X7 A5 e1 ^1 Y$ d3 d: r       #include <sys/socket.h>
: x3 I- X  {1 ]+ U8 x" B) P9 P       函数原型:
0 S. }4 k5 K# F1 J0 T       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)1 W# _  G0 F: _- Y) ~: U
           sockfd: 目的服务器的socket描述符3 K; W- V! v6 j
           serv_addr:包含目的机器ip地址和端口号的指针. \* L. X0 a8 b" h
           addrlen:sizeof(struct sockaddr)
( H5 f! D% K, Z% p0 s' q* |! ]4 ?- S3 Q& W0 y
    4 listen()! N" p/ V, i5 J9 k4 G  Z/ r1 H
       头文件:
# P) {! R& P* d' B) n! r3 M# _2 x       #include <sys/socket.h>) P6 E+ L8 ^$ K$ }9 ], c& g- }0 {
       函数原型:3 h8 x3 e1 K! t2 |
       int listen(int sockfd, int backlog);
$ M+ h; B3 {) Y2 X4 I4 ^           sockfd:socket()系统调用返回的socket描述符% c% r, `0 U9 O
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
) T9 ?" M+ k) [8 Y& k/ `# {% U2 T: x& }' w) s
    5 accept(); n4 S# X! g4 m$ Z
       头文件:   
% v1 M4 e; V( U6 c" i- A+ I/ y& e       #include <sys/types.h>" s9 l9 V, p* U  G
       #inlcude <sys/socket.h>) A; n& Q5 T1 l) |
       函数原型:* f. j0 T1 }8 n9 y: H' y
       int accept(int sockfd, void *addr, int addrlen)
# z1 D+ I. L: M) Z7 q8 g           sockfd:是被监听的socket描述符
# {5 C  w/ m8 _  c3 c( q           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
1 f  Q% U0 t* r           addrlen:sizeof(struct sockaddr_in)1 N( T! c# s5 P/ F  T9 Q0 r& [( M. z
       7 Y# F5 \; W/ q; z. [# r
    6 send()* d' e) I) y$ E
        头文件:7 B0 d0 }7 d: O# E$ Q
        #include <sys/socket.h>4 D% ^. P6 l! |1 `" T8 }
        函数原型:
- A$ ~' X5 m) j$ n        int send(int sockfd, const void *msg, int len, int flags);/ Q/ Y: G/ N) m3 S  n- ~. N  \  p$ ?( T
           sockfd:用来传输数据的socket描述符+ a" L: N$ B: J$ Y/ E# p$ s
           msg:要发送数据的指针
2 j1 }8 l6 ^7 y( K+ w1 n# d- n+ ^           flags: 06 V/ I0 s' }# D# t) E
      $ {% J# I, }! j$ V" S, z8 u
    7 recv()
$ t% w5 J$ B0 j% T' f( @        头文件:
+ K# M% N- L9 q2 q, f        #include <sys/types.h>. z+ x4 k# h/ x: i; T
        #include <sys/socket.h>
4 i- F4 R" b/ n, s        函数原型:3 c$ L/ h' v) M5 T' D; Y
        int recv(int sockfd, void *buf, int len, unsigned int flags)/ H0 J/ K+ L; z  s
          sockfd:接收数据的socket描述符
2 ?( k$ I& _& ~0 t! j4 Z& H3 V          buf:存放数据的缓冲区' P7 h) b0 P/ ^, }! q" W# ~
          len:缓冲的长度) z4 p0 C2 g: x" K5 m) e
          flags:0/ Q1 H& F' }$ A8 a

/ k5 {2 Y' P0 g    8 sendto()
, ~5 I6 T; r7 k- L1 i       头文件:
8 K( o0 @& y  K) w+ C" M       #include <sys/types.h>" N9 g! b4 s% t
       #include <sys/socket.h>
6 B9 Y' n9 x! O+ M  X       函数原型:& e0 F2 F$ I/ C' g0 K. E5 l
       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
( l( ^: {" Z% r  z: l        
8 b+ L* A) v8 R7 M& S* v   
6 H+ W! L: g3 Y1 i" j7 Q, Q# A    9 recvfrom(), N4 x/ [  r) J4 I- ?
       头文件:
/ T+ j, ?( N% F" X8 g7 G  H7 d1 M) n       #include <sys/types.h>
; f: b( w: i0 c9 b       #include <sys/socket.h>$ R/ b# L$ r7 y$ A% P# W
       函数原型:. T- c7 b& R% R+ `  ]- E) h
       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)7 F% e5 W# h7 E$ Z0 f4 [% F

( ]8 u. @: M) A$ i) f9 [) D3 o, k   
/ ?: h, f' u2 ^: W    10 read() write(). b; a( L8 F4 S+ o& }6 @8 O1 E  b
       int read(int fd, char *buf, int len)- Y* Q* u/ m' Z* ^" n$ E( k  p
       int write(int fd, char *buf, int len)
5 K. }' ]4 o3 L3 i      
# v8 ~2 b- [& ~6 I: S    11 shutdown(). O3 J3 M3 S! H$ w6 `* U
       close(sockfd)5 {# y$ ?/ d' U, R0 x3 O
       int shutdown(int sockfd, int how)3 L/ Z8 x! f4 B0 K- s' {) 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等)   
# c+ I3 S6 e% X! @9 n9 L) n; N' }<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
/ a! C9 T- }- h# j<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()
7 ?9 z9 J7 P' j% c1 v  ^<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
; C( O+ `, d5 A5 S7 z  _<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等: \, T  Y8 S7 T" d% E& J
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等3 S* x4 e+ V; R; V! O& G6 |
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
9 _6 N2 y; ?3 ~/ P8 @! M% ]; K5 y4 P' |7 Z6 z6 J% I% E" \5 b
[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等
% R8 k; H% r9 w4 b( N#include <sys/types.h>      
# _1 U8 l7 M1 P7 d9 }& g- z
9 ]* E0 H* R0 @#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons$ ^3 }9 ~9 M+ t( T& m- f2 a* |
#include <poll.h>             //poll,pollfd
* J! J$ L- \: B9 B' K- F8 R#include <arpa/inet.h>   //inet_addr,inet_aton, \4 K6 j2 y% b' {
#include <unistd.h>        //read,write
. }$ K$ [* e' P" o9 u" P& Z7 t#include <netdb.h>         //gethostbyname
- @1 }& k3 e) x7 @. J* G. c' ]! e# x! {2 `) {
#include <error.h>         //perror
$ n+ i, g3 q3 v6 `( l#include <stdio.h>! H6 h, g6 p  y$ ?) |- Q- F2 N# K$ \
#include <errno.h>         //errno& @! n3 U6 |1 f# u

7 i/ S) H5 [* M' O#include <string.h>          // memset! d' b# E7 M# s3 C6 A5 V" v! D
#include <string>
* q4 j$ a! h2 a- F8 B4 y6 ?/ y#include <iostream>

1 u7 \) v2 a$ Q$ g7 N  @( L; D# q! L, R/ s2 @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:56 , Processed in 0.079976 second(s), 19 queries .

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