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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:/ C6 S$ C& e* m! X! ^  x9 R2 D
1.流式套接字(SOCKET_STREAM)
) y( Q9 s( x+ K; \    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。6 W' V4 h; ?0 B) D% {2 D) p; o
2.数据报式套接字(SOCKET_DGRAM)
  L: Z' z: M% e: }1 n    提供无连接的数据传输服务,不保证可靠性。7 H! G/ r1 E3 n% N" Z% n" |
3.原始式套接字(SOCKET_RAW)9 h3 Z6 z7 L; i% @# `+ T
    该接口允许对较低层次协议,如IP,ICMP直接访问。
- ]; l+ L) h+ G. _) p/ }# Q" v$ ]' t; l. G7 j
二 基本套接字系统调有有如下一些:# l. Y( e; T% E7 Y, O2 w
    创建套接字: socket()
+ z2 ~5 h* c7 N+ C: l    绑定本机端口: bind()
/ C, E  x1 l7 L% W3 c% E  Z) E    建立连接: connect(),accept(): k! M2 H! t+ }6 C3 Q
    侦听端口: listen()
  R$ U; F5 p; e7 z    数据传输: send(), recv(); v  I8 U6 ?& x% J8 ^6 b
    输入/输出多路复用: select()
  n$ \$ l! i$ ]; k; x. u    关闭套接只:   closesocket()
! R6 c( ^# U7 ]   
9 R6 k( S- n6 Y' Y4 \三 数据类型6 p0 b% \( l7 O6 [4 Y1 ~* t2 `: u
    struct sockaddr
, a+ ~8 W( `" a8 E  t. E    {
8 D  c& q+ s$ @; [9 e4 u& P& k' m       unsigned short  sa_family;   //地址族, 一般为AF_INET& n' T* w8 i3 I1 O& e" P# l
       char                  sa_data[14];   //14字节的协议地址8 W/ d* e, R( ~1 |0 v  s8 i
    }9 Q5 Y" G9 ~; k4 b% [

* q! e) Y- u5 ?7 B5 O' A, n    struct sockaddr_in* U, N; E, l- b
    {
' X* x0 j! y) c       short int                     sin_family;   //地址族
$ p8 L( s7 f& `# y4 E3 p9 q       unsigned short int      sin_port;      //端口号
+ F* ?- \7 T% Y& ~5 v       struct in_addr             in_addr;      //ip地址& q6 j# ?# L- ?1 z7 `
       unsigned char             sin_zero[8];  //填充
' ^' d" k9 k" P- I8 w: w6 h    }
3 E+ H8 Z" e$ p: V7 k: B- C0 y& _$ o: q
四 常用函数. B9 @9 f, {' y
    1 socket()" G& E# l  a: D* J. n
       头文件:
2 r0 c6 ]; `  s% |5 c" e2 c2 ~. v% O       #include <sys/types.h>
! P9 u) P9 A$ v0 \/ r" T       #include <sys/socket.h>
" L! S  z5 p" v6 a" Z" B       函数原型:
. Y0 ~* v: n6 r# Y, a! x+ @       int socket(int domain, int type, int protocol)5 [3 g& o4 x# A) y7 t  x
          domain: 协议类型,一般为AF_INET4 r# i. W7 |& C# A$ A
          type: socket类型- q3 W2 [9 [) v; x# h$ @, c
          protocol:用来指定socket所使用的传输协议编号,通常设为0即可$ z, m7 z3 }$ s; M$ c

  P7 U( `2 t/ A( e0 j    2 bind(). B. R- P, c, k$ Y9 M, b4 _
       头文件:' `& C7 \( s( J8 [" H# k
       #include <sys/types.h>
+ @" C) ?: ?( A& n' j& w       #include <sys/socket.h>6 b5 t! R* b& J6 {5 I; L9 m3 ]
       函数原型:
  e, \" @$ c+ ]0 K       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)9 d' K$ K2 a% Q1 I' m
          sockfd: socket描述符
1 s" B. R4 k. ]. O( M7 K7 o3 z4 _          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
+ }* ^0 J' M0 i- u* I* @          addrlen:常被设为sizeof(struct sockaddr)
, i$ K  ?* ^" Z9 k3 x* u+ k* D: S& x- y
    3 connect()5 B* [3 ^6 f- K
       头文件:% r9 y# \4 o& e7 n+ ?# E
       #include <sys/types.h>  
( |) \0 h6 ^, V" d       #include <sys/socket.h>* N6 i7 U, o; w/ ~
       函数原型:6 S7 H7 e% P3 |
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)# y9 N: S7 a) Q9 x7 S" W! T
           sockfd: 目的服务器的socket描述符: U* D& q, g6 D1 [" J
           serv_addr:包含目的机器ip地址和端口号的指针
  Y  y4 Y' z' B3 v6 A* `/ S           addrlen:sizeof(struct sockaddr)9 Q5 O* t6 i6 ~0 P/ ]& F, j

  k1 F; |  R( G% @$ g7 L    4 listen()( T8 s. e* g3 |4 P' z
       头文件:
, R( H, t$ V! B       #include <sys/socket.h>
* u: [  K, }& d) O- f1 x       函数原型:
: h* S% |2 e  @* A       int listen(int sockfd, int backlog);# e* Z# @, X& @8 {5 j. g! g
           sockfd:socket()系统调用返回的socket描述符/ |. j8 g9 d8 [2 X5 G& w1 R/ z( P
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。, r9 m% L, ~6 G+ Y* J8 V- C1 d7 q
0 B2 E" t; o, q; ?1 r6 j9 [+ Q! E; x
    5 accept()
' O' i' ^/ _) D2 T% w: d! i       头文件:   & X0 Z/ U- |3 q# x8 S
       #include <sys/types.h>
/ \' P8 s9 m+ y: C! N7 ^6 _       #inlcude <sys/socket.h>
  t& x' Z. \+ L       函数原型:
3 o* [1 u  h. c4 ^. _7 N! S) `- t       int accept(int sockfd, void *addr, int addrlen)* P5 D/ X3 ?- H9 ~' f' ]
           sockfd:是被监听的socket描述符; i. T+ X; J( H4 H' ~* L; B& u
           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息' ?' P+ C& a! [4 ~, D& A# t" e4 a
           addrlen:sizeof(struct sockaddr_in)
4 j1 S8 j1 M3 }5 v      
8 f% H" D+ z" O- K# p" [$ R    6 send()3 L8 e( V% Z% Q- Y/ F
        头文件:
1 U' B8 ?1 i# ~7 y& h        #include <sys/socket.h>
1 p7 H( w, k) w' ~" }        函数原型:6 j; c- D7 k3 E$ V+ Z2 @
        int send(int sockfd, const void *msg, int len, int flags);5 F$ C+ K( W) e6 v2 v  R4 E
           sockfd:用来传输数据的socket描述符' a: \3 a2 F% j" A$ W, x) K
           msg:要发送数据的指针
* {; S. S* R% B           flags: 01 ^; k' c: r) M, ?: u# }" e* {; h
      
, k! j: N; ?% _! B. h& p  ~    7 recv()* [. q2 |! @6 q0 `. x
        头文件:
% T' i; }, P4 K8 V        #include <sys/types.h>" e5 v' h7 `1 a- U" y6 p
        #include <sys/socket.h>
9 `" N' ^* q) N, s2 H( |* x7 R        函数原型:  f8 t2 I. O3 \- h7 w  G4 [, U9 U
        int recv(int sockfd, void *buf, int len, unsigned int flags)' }3 O+ ~. _: I5 K, d5 i( p2 t" {
          sockfd:接收数据的socket描述符& e  z7 }7 S3 q" ~- z: o
          buf:存放数据的缓冲区* N3 g  L% V4 t! w! W& t" }$ K
          len:缓冲的长度
" C2 B3 i4 j, {          flags:0
3 H: E) n% {5 r! U+ r. N
- |& E' y+ Y: w# F1 m    8 sendto()
  v5 F1 e" i, Y- }, c3 }       头文件:
9 {! J4 j6 k1 U       #include <sys/types.h>" \+ A/ p* W; e# ]- z5 {6 h4 g  E
       #include <sys/socket.h>- X& a* i5 Q* L7 p* e, I
       函数原型:
+ h+ X3 C8 p! z4 q       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
' a0 E; I% u. d* C6 s6 w3 p+ q        2 s% }. V# _9 I2 s9 R& L, U
   
, w3 z/ z5 }0 u* s! E' x9 _% Q    9 recvfrom()
) D# r, m) r, q2 j7 Z) s       头文件:
" k$ ^, e; C  ^" S/ i: q       #include <sys/types.h>+ \4 E; k2 U' y9 K
       #include <sys/socket.h>
9 X- T5 ]# _) e: p$ h, I% p* t; A       函数原型:8 Y# q7 C* i' }) g# L& S  d* V! i4 q
       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
2 f+ x- T. M4 _1 K
$ I0 v; t4 N5 [+ F* l6 E   
  c6 a% e( b; s* x    10 read() write()
& C% `3 m  I: k  b       int read(int fd, char *buf, int len)/ U+ f! u/ u. N/ Z
       int write(int fd, char *buf, int len)
5 a- ?0 [6 W) p3 r) e$ O; f       " S7 y! O  \  h. F+ G0 b4 a8 }
    11 shutdown(): V6 {5 g7 M9 H8 Y
       close(sockfd)! G7 i7 ~" y2 l
       int shutdown(int sockfd, int how)( E# ^' Q! s1 g: j
-----------------------------------
[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等)   ! b# z2 ]' N; ?  P  s4 L9 X5 D1 y
<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等$ @5 |! V# k' s$ D( s; Q5 r- p
<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()" Z& n( ^  E. T% q& I* H
<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
- @( I* F* q4 `7 G. P6 w<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等
& d3 n* X" W( D; @6 R) h  v<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等$ r4 M' G1 N- e/ `1 A
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
; u, P1 R3 N7 q! ^
0 c( @3 o4 Q7 o1 L/ P[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等# Q6 P3 |8 V/ a- ~" c# W. W
#include <sys/types.h>      ' Z+ q* o, m3 j6 x1 X! @) x! B6 g

' _7 S9 o1 Y6 h( |7 h9 Y#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons0 J' |9 z* }: a9 A; U% p/ w* b7 z
#include <poll.h>             //poll,pollfd( m% K+ i+ a- L1 x3 ^+ ^9 E
#include <arpa/inet.h>   //inet_addr,inet_aton
5 u2 x9 _( X4 u7 y#include <unistd.h>        //read,write/ `2 L& I$ ~+ o9 J/ d/ w" U& `. B0 t
#include <netdb.h>         //gethostbyname: n* b' Y9 \5 t4 ^

6 }, _" N1 t; l2 F2 P#include <error.h>         //perror
3 z& |5 q* {/ X$ I) C5 P#include <stdio.h>
" B/ ~3 e- M/ M# l# W  ]! O#include <errno.h>         //errno
8 k4 p. p' i, z+ L  |) C+ X% D8 S* p' ?( y" E! @
#include <string.h>          // memset
& ]' U+ P# U2 [#include <string>
4 O5 A, m. ?2 K( j6 l# d" x+ c#include <iostream>

) s8 N8 o& P. Z2 C. s4 \+ t! t1 g, H+ W3 w6 `4 u+ ?" e$ U: o8 O& C1 b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 11:45 , Processed in 0.054644 second(s), 19 queries .

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