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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:1 X: \+ T- O+ |2 _
1.流式套接字(SOCKET_STREAM)
4 e  `; {4 N% ^" p( W0 A& z' d    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。/ E6 u& ^# ~1 Q
2.数据报式套接字(SOCKET_DGRAM)* \3 c% ^' k% e6 r" }8 }" _
    提供无连接的数据传输服务,不保证可靠性。
  L) }, y7 ~9 L- T3.原始式套接字(SOCKET_RAW): q- c5 F2 I! c
    该接口允许对较低层次协议,如IP,ICMP直接访问。
  I1 [  s0 S5 s9 l" L) e2 f& l3 [: z
5 x* j9 R, M% N" I1 F/ f4 K二 基本套接字系统调有有如下一些:  z9 b: |1 m& {: P
    创建套接字: socket()  m  j) m& b) Q- F) A( C
    绑定本机端口: bind()
) b/ d+ k5 _: l) e! {- H    建立连接: connect(),accept()! @- X6 {- ?* F
    侦听端口: listen()
/ x+ @4 a8 u4 E$ G% O% `0 w5 p    数据传输: send(), recv()
* Q9 W9 q) |7 ^7 i# x    输入/输出多路复用: select()2 t2 a0 D  G% `6 H  F$ d: w
    关闭套接只:   closesocket()$ {0 m! n+ k4 G2 C& B
   
  C# ~/ W' ~% d8 m- S. }4 U三 数据类型
% H$ j" n. O% k9 y1 \    struct sockaddr, V% E' t9 y. e/ w
    {
, l8 [: b6 ?1 z3 _* q3 ?: z+ Y       unsigned short  sa_family;   //地址族, 一般为AF_INET
& V9 M7 P8 h9 w       char                  sa_data[14];   //14字节的协议地址
/ O. p0 k+ R3 m    }8 y) @( x) _& }

( a& I# `( k( q, y# R9 c( p, p    struct sockaddr_in
1 q6 Y$ ^0 }+ X    {
8 v; ^- Y' K1 |: N       short int                     sin_family;   //地址族
5 x5 ^3 J( T9 |8 f/ G4 b$ E       unsigned short int      sin_port;      //端口号3 N5 Y9 ?' @( C/ |  `! k
       struct in_addr             in_addr;      //ip地址9 R: @% ^# k* y- P2 ~
       unsigned char             sin_zero[8];  //填充
( U; p- R: e( C5 _9 \  z    }
! o! P' ?: |' _6 c  e9 b$ \  d
7 P5 r. F7 S9 Q3 M6 a1 `& x四 常用函数# ^6 [' A! A3 Q5 {3 N) L
    1 socket()
- }% Q) n) e# K; I       头文件: . g( W* P6 q, x  t+ D& }: t; a
       #include <sys/types.h># g  I/ R# c; j) \  ^' Y, ]
       #include <sys/socket.h>
2 w- z6 s1 v& W* k! S5 j, c       函数原型:
. }1 c( C& V" ~1 o$ [7 @' h$ z       int socket(int domain, int type, int protocol)2 e! P: }2 `; z4 ?( {$ U
          domain: 协议类型,一般为AF_INET: ]* p( ]* W. r; G( v0 [! U
          type: socket类型
6 X. Q& _- Q; s5 @          protocol:用来指定socket所使用的传输协议编号,通常设为0即可
/ W2 c" m1 j$ W2 }: M7 R; ~# D
* Y% S8 y; i% a" K    2 bind()
  g* O4 J; a# L6 f" e       头文件:
% }6 Q: v# g8 U. d( u       #include <sys/types.h>, g3 o3 E- S: x6 E( h9 e
       #include <sys/socket.h>
2 V! m( }: K  J7 Z9 u" ]       函数原型:
1 N) g3 ]0 p3 U       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)' y2 w3 M2 k9 I2 m5 ~8 J
          sockfd: socket描述符9 M/ L. _$ H" C. B8 ]: M2 Z
          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针& ]. f) J  V7 r- p: N
          addrlen:常被设为sizeof(struct sockaddr)
2 g  k( |& ^9 o  h4 i+ x( }& e
9 v$ B/ L/ l: _5 O0 O    3 connect()
) P) x/ n9 C( d$ Q       头文件:/ k( |0 C- {6 z" I' M
       #include <sys/types.h>  
9 Q8 v$ q) o! u) M% I       #include <sys/socket.h>
! [  W4 C; _0 U3 d( a       函数原型:$ b; Z5 {0 r" }# @4 i  u6 K5 Q
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
( T+ T: t! ]# _+ E           sockfd: 目的服务器的socket描述符
& d6 t8 S) \: ~- F3 v           serv_addr:包含目的机器ip地址和端口号的指针
3 H' m) q- e. D' l$ P3 r  W           addrlen:sizeof(struct sockaddr)
4 y9 e( q; H" X9 f% R, j9 s) ^) b5 s. S! L/ T
    4 listen()
, F* i. X- Z0 g4 n$ H       头文件:
3 e. X" V9 A! t7 b+ O7 D       #include <sys/socket.h>
: M  E1 J* z. D       函数原型:
6 V: n8 X: A3 x( h       int listen(int sockfd, int backlog);
% l9 B/ p) d7 V) m2 m8 e           sockfd:socket()系统调用返回的socket描述符9 d+ U0 Z, ~* C$ @6 F* W
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。! \! i4 {9 L' T- {0 m

) }' r) k' X/ p" }    5 accept(). v) d( j+ {+ S& F% Q9 R$ G$ X
       头文件:   
- w; U6 @9 y* [; Y7 r' e       #include <sys/types.h>
# d  _$ _9 T5 E       #inlcude <sys/socket.h>
$ g4 D! E: l. g. l       函数原型:; x: `2 F/ I; _5 Y2 A: X: b
       int accept(int sockfd, void *addr, int addrlen)6 \' }4 O" O  P1 ?  K
           sockfd:是被监听的socket描述符( ?3 o  S: Y/ U. k' w$ e2 g
           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息- @( s& K: O& E& f
           addrlen:sizeof(struct sockaddr_in); w& J# m8 }" U9 f$ o& d
       / ^3 o$ a" S1 B& t
    6 send()
9 B! a# p* U  h1 {        头文件:
# _2 H2 n8 q3 B- q        #include <sys/socket.h>
) M6 O+ Z' T8 K7 {$ p; I        函数原型:& f8 @/ g/ N- w% C
        int send(int sockfd, const void *msg, int len, int flags);# I$ n# c. w; l5 s1 G. v& o0 F
           sockfd:用来传输数据的socket描述符
, t* h5 U. q: q# ?+ O  q           msg:要发送数据的指针 % Q& I: x% l7 ?, }+ y; `
           flags: 0  T6 B0 j0 o- o8 x4 W7 E5 ]: ]
      * R+ T' }& `6 _" i
    7 recv()
! R: F: P3 G9 p) E        头文件:
- U0 O1 E: }+ i        #include <sys/types.h>
: \- I) `" H5 d. e# K5 `, G        #include <sys/socket.h>+ k# B1 r+ T( ]6 j
        函数原型:
" I: O' A' V# `        int recv(int sockfd, void *buf, int len, unsigned int flags)
7 E7 k( `. i, b. f$ Y  K- @          sockfd:接收数据的socket描述符0 B  {0 _  u- u
          buf:存放数据的缓冲区
7 p) m# \. k* \5 ?) G4 Q- q, I- {          len:缓冲的长度+ ?5 D# l; D5 Z: v0 L) O
          flags:05 u7 ]9 `! Q  X8 E+ U

$ x0 R) T! q; X) [1 L9 B' Q; _! f    8 sendto()
  k* H" w+ B6 g9 ]. h% t) ^0 I       头文件:, H9 w/ l4 E* x9 Y
       #include <sys/types.h>
4 C9 X- E8 `1 s; l- D, h       #include <sys/socket.h>3 h& L. f: W. Q! T3 V
       函数原型:
/ u4 m9 ~+ m' N  a$ ^& M2 r; t6 `" J       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);9 E$ h' J) b. m0 I* q) s3 {9 X
        ; ^! |- u& u, F2 l
   
$ A' q0 L3 ~, X+ r4 F5 c    9 recvfrom()6 q9 [# l/ d% O: d
       头文件:
' B, x2 z9 }. H; A# A       #include <sys/types.h>
3 n6 a* S& `. h# b1 A       #include <sys/socket.h>
; O4 @7 E, ^9 a2 o1 W% @       函数原型:
. r) Z) l# B8 N7 G& _' ~       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
0 k9 B+ @4 u: ]  G' C# V) J% o
: K2 m. v9 [" y+ z* ]   
5 _1 I5 B: q) ^3 f) u    10 read() write()
: H  q4 O$ I! D; ~3 `       int read(int fd, char *buf, int len)
& ]: X( O" m6 N       int write(int fd, char *buf, int len)
( M8 `3 r$ S2 v/ j$ J       7 O" _+ d' L5 \
    11 shutdown()9 U: [# B4 u. s% V
       close(sockfd)
9 A. m' P* F# U) x       int shutdown(int sockfd, int how)+ y1 I; }- q2 `$ I, Z. m: v' s$ v
-----------------------------------
[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等)   $ d/ T; d- J- z! |
<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等: c$ h) W/ \/ V4 p
<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()
- w' E* E- U) g7 T3 u, z) ~<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等. A/ K( z9 U! j0 {, U
<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等! |5 F' t5 g/ r8 N' Q
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等% W( ?  f! D5 y
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件& d  f1 }* Q' k0 y% Z# F9 |

. l* q# v' ?, a! A[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等7 J. t9 C# z2 _  H! n' M1 F
#include <sys/types.h>      
' ~/ }8 N' x+ Z
6 e7 Y$ X$ v& w#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons, ~5 b7 @+ x& z1 C- A
#include <poll.h>             //poll,pollfd# Q0 o* u# Q( O( J  r
#include <arpa/inet.h>   //inet_addr,inet_aton9 W7 ^) G* [/ d3 I
#include <unistd.h>        //read,write
" {. e( V6 h( ?0 v2 X% K#include <netdb.h>         //gethostbyname; v4 Z# ~  [2 W- x
9 \% X5 H# h: S6 E* t; S
#include <error.h>         //perror7 G' E2 W: e7 H9 b' \
#include <stdio.h>+ q8 X1 D0 {* l; k
#include <errno.h>         //errno
5 G' @8 \* q7 i; M* W: [$ ]6 |$ w- g# f. S3 J" u
#include <string.h>          // memset' T1 f, f4 m9 Y2 x* K7 v
#include <string>
1 H* `- u: e7 `' K) i#include <iostream>
/ r! r/ f/ _; m; h
5 E. d, o1 R; U: m9 _2 c" W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 16:06 , Processed in 0.064195 second(s), 21 queries .

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