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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:& d1 a% d" n& A) u3 n. R5 Q
1.流式套接字(SOCKET_STREAM)
1 L3 S( H$ j( i4 S. f    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。
9 q( b) }0 |  M5 i+ J0 \2.数据报式套接字(SOCKET_DGRAM)
1 g1 R7 R$ \4 i1 O1 A  ~  S4 V    提供无连接的数据传输服务,不保证可靠性。! N# `! k  F" e8 A/ K. b0 d- f" F2 J2 l
3.原始式套接字(SOCKET_RAW)7 Y6 z1 e9 e1 I. n
    该接口允许对较低层次协议,如IP,ICMP直接访问。
( p. ~! ]2 v( Z9 X! w
6 l# @8 V1 ^9 J. o二 基本套接字系统调有有如下一些:
+ A9 ]" Q: s* S5 t) P# E. t/ [7 l    创建套接字: socket()9 N5 |1 L; ^8 g% G  i3 G$ V6 ~
    绑定本机端口: bind()
$ r  p! o$ N# a0 R    建立连接: connect(),accept()0 C* ^; p0 u  U  r; L+ |
    侦听端口: listen()0 U% _  u# @5 X' }1 o" {$ }
    数据传输: send(), recv()) J: E' [- N0 k( J6 r
    输入/输出多路复用: select()
" `3 z, v5 r1 ]* x    关闭套接只:   closesocket()
8 g6 T( L7 k5 f7 J2 a    4 D) G3 |$ T+ P
三 数据类型: S# z" W4 y% i" t
    struct sockaddr, `$ M- K- C8 ~0 n7 @
    {
# w. ~, X/ A6 X9 j& _       unsigned short  sa_family;   //地址族, 一般为AF_INET
( p% K: C, S: S7 J       char                  sa_data[14];   //14字节的协议地址
# K6 a9 @9 ]! k( M4 _7 x    }1 T9 b) }9 d6 \+ o! B
/ q2 e" D9 T, x! G
    struct sockaddr_in( s( f. G* S- t0 R9 |+ q
    {" [9 K& s" p( N- l9 J
       short int                     sin_family;   //地址族
; l& T. E5 @) c2 a1 H       unsigned short int      sin_port;      //端口号- }0 D0 a0 J8 [. U1 k
       struct in_addr             in_addr;      //ip地址
9 E- v$ n# m' I3 X$ E* V2 K       unsigned char             sin_zero[8];  //填充
' n  D+ H6 X; v6 \5 r. J6 W    }' q1 G# U  q+ e! |% D* G- i8 c

* r2 y- E8 C: h, S" B- [四 常用函数5 Q2 h. N0 P) m( r8 _; Q  L! X5 d' _
    1 socket()0 O* T" w- }% x% c
       头文件:
5 E/ d( x9 t' K' J8 D4 s3 `. u       #include <sys/types.h>
& E8 c0 u2 ~  X- \3 e2 |       #include <sys/socket.h>
% V* o( R3 i% l  X* C5 T       函数原型:& O- x  J* i) V2 `- V
       int socket(int domain, int type, int protocol)
- L5 o1 z9 ~3 b& D4 @# z1 U0 d          domain: 协议类型,一般为AF_INET
; ^6 g4 L! m7 ^2 _7 R          type: socket类型0 |8 H+ _! r& m! T$ q/ j
          protocol:用来指定socket所使用的传输协议编号,通常设为0即可" G2 Q/ u9 w$ N

/ c! s- j6 j+ @# _    2 bind(); y" Q. n* u3 }
       头文件:
' D# e, G. N8 l" |% U: }       #include <sys/types.h>( d/ G" M$ K2 Z# W
       #include <sys/socket.h>
+ u9 H- {0 [2 z+ t0 l7 ^2 A       函数原型:) Q  ?% O3 S2 T/ \  D. n
       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
/ W: I/ t& X- M$ u* i" r% S* d7 E          sockfd: socket描述符
1 X4 d9 H* O* @8 o          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
$ t6 |' w9 j  a- u* h( E* H          addrlen:常被设为sizeof(struct sockaddr)
  w4 r0 e! R6 l& ]% n/ ~3 U- X" v& c
' M, Y( k# M- \2 @! U8 `    3 connect(); h  {4 \  m1 W9 y# n5 y; }; s
       头文件:
0 a5 X' [+ c- V2 g' x. R       #include <sys/types.h>  - E/ w, p0 @* N* B: ?
       #include <sys/socket.h>
* S$ |" {0 c" L# E8 |3 G1 E" }+ d       函数原型:! B/ D: C" \& d" w2 x. p
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen): r( z8 q/ W* }3 J
           sockfd: 目的服务器的socket描述符
* x7 T. a! _0 E" o1 x9 T           serv_addr:包含目的机器ip地址和端口号的指针
: Q+ d. o6 \  q( E           addrlen:sizeof(struct sockaddr)
* q! t6 M& z! Y0 o$ \; O9 r4 ]% z- i' ~* `" F, w0 T5 G
    4 listen()6 `- K: d1 a- a
       头文件:- J0 b: I& f0 R1 _0 l8 l( y, K5 O
       #include <sys/socket.h>; F* }! r9 P. z7 t7 `# P
       函数原型:
9 X6 S# q# \: N5 L' [       int listen(int sockfd, int backlog);- w$ u/ k/ F7 q& u
           sockfd:socket()系统调用返回的socket描述符- B. O5 z* t# n) s, Y- }  @
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
0 K" z0 n& T0 B( U  [- i
* ]5 J4 d: W2 X: m) W9 B6 w1 F    5 accept()
- p- g- f/ z1 x5 `3 L7 x6 n       头文件:   
( Z9 M" `# i$ y  R, s! @# r       #include <sys/types.h>
- U  n) [( S/ f* Q/ l0 A# \       #inlcude <sys/socket.h>
; i3 M3 j) N% E1 _# I       函数原型:: c7 o+ ^8 ^: p; X! B& w
       int accept(int sockfd, void *addr, int addrlen)
6 K5 f3 O" ~! M" [: C( m# _           sockfd:是被监听的socket描述符, J" C+ q6 z% N! N3 R
           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息, f/ ]% H. Z6 V! X) E9 j+ g. u$ O
           addrlen:sizeof(struct sockaddr_in)
8 u* \! E+ f/ Z# y  w       . d. Y5 J" Y& \3 R% {5 V- B
    6 send()8 k$ {4 w& E% s) x- b
        头文件:( p. k  H* L9 {0 a
        #include <sys/socket.h>5 G# P/ A' l- K: V  y& R  E2 `
        函数原型:
( R* e! p+ v% E  X        int send(int sockfd, const void *msg, int len, int flags);
  K# y$ I6 A- [. ~+ D+ u' H& ~           sockfd:用来传输数据的socket描述符
1 n) m% H8 v  p: L           msg:要发送数据的指针 4 q8 N3 v, u; I: ^. z
           flags: 0
# W4 Z* ~$ n/ ?) p% o" c% B4 i      
5 a4 X4 L# w" b+ [( R/ O    7 recv()
, a; l) _9 L) P% y$ T1 ?        头文件:5 w5 E3 X8 e/ |3 I: j
        #include <sys/types.h>
0 b8 L- L6 c7 b        #include <sys/socket.h>
1 I2 N/ q" W) L! P        函数原型:
# F* _' t$ J7 j6 l: i" w4 Z        int recv(int sockfd, void *buf, int len, unsigned int flags)4 w9 C/ P4 ]# I
          sockfd:接收数据的socket描述符
  C& P4 ?% w# ?          buf:存放数据的缓冲区" @, k$ X% w* F. Z; p, w
          len:缓冲的长度' A# n/ _+ B1 w" v  \
          flags:0' t" B% o9 \* C  Z
- T+ ]& z5 Q: l9 ^2 l* |: q8 [
    8 sendto()6 F. T& c8 C! L' K
       头文件:
( R7 @( J* y' H8 b4 f, f& m# Q       #include <sys/types.h>  Y, |1 u7 {3 c+ q& y# V
       #include <sys/socket.h>
* h0 t. p/ `# E- R/ u: W0 s3 K1 c( t       函数原型:
9 \* G# N% `. M, B5 c  N# ]       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
5 S3 V' d! m  s2 l. O: W        
; C2 c: I, I3 U5 C1 i    9 B4 g8 G4 i1 J+ O( X7 k! x! t
    9 recvfrom()# x2 E1 \% A; f( O( {$ c
       头文件:8 c) r6 ?0 E; q1 w) Z3 X$ b+ ^+ }
       #include <sys/types.h>
5 M: t6 z: r) U( e0 ?- h- n       #include <sys/socket.h>$ k; K# z: T: r" ]6 N8 T" L
       函数原型:
; q3 X8 g$ [/ K       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
' p/ Y, [3 c7 v3 C% l. r8 `6 x, j$ n+ S" n4 ~" }
   
8 l) V5 U/ W1 U    10 read() write()
+ v3 g% n7 K1 _$ Z+ H# D  I0 f- o       int read(int fd, char *buf, int len)2 N+ R# h/ D% V& ]" ?. S; M) _$ ]
       int write(int fd, char *buf, int len)
+ L& G. _5 U+ n$ V% g, r      
$ C0 l  M% _' j; a6 \    11 shutdown()5 _1 ~( b# m6 p* y7 `# D, X3 y+ r1 p. _
       close(sockfd)! ?! }/ W+ h! H
       int shutdown(int sockfd, int how)! R: ?. L: Q( Y2 b' q- p
-----------------------------------
[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等)   / R/ Z1 `9 K) G* |6 @3 k  ?
<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等: C5 L$ N6 D1 m' z: E
<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()
- f5 I. {2 K: j<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等& K: N4 a9 a, a  t3 t
<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等" f# V! o. h: ^# i# N. t) F* L
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等
9 C" C; x, D9 Q<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件+ ?  f3 d& v6 L% H3 `* g. C" @
" k$ k6 E6 }+ z- D/ t( M1 F
[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等
: |8 \- ?# N: F: z% H#include <sys/types.h>      ! D2 l, v& D4 Y8 c* D

: `" F9 R( j2 V#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons6 Z1 \$ b4 |# Q: k' h, K* h
#include <poll.h>             //poll,pollfd
' a3 F+ u/ _. p. Y* w- s#include <arpa/inet.h>   //inet_addr,inet_aton
8 D% V8 B3 M; ~7 S" f! x3 x+ q- R#include <unistd.h>        //read,write! Y' F% t' A7 h8 A9 x7 i
#include <netdb.h>         //gethostbyname
; o; B1 f5 q% b( e9 }$ S
2 N$ F, W: m# P#include <error.h>         //perror/ D7 Y5 m# I% r% T6 f
#include <stdio.h>+ N# F8 Z) `2 E7 z3 G
#include <errno.h>         //errno
0 {- a3 n& e  M) R; d% P! W% d) ^( I& O& S
#include <string.h>          // memset
) g# }  o, F0 |1 L#include <string>
# [; p2 @* Z+ p) h% ?#include <iostream>
" N( d# ^7 Y4 ^: B- V8 |% ]

) K' I3 J3 p4 c/ C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 04:57 , Processed in 0.112803 second(s), 21 queries .

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