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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:
4 X0 T$ v$ i3 G6 E' N6 [+ W1.流式套接字(SOCKET_STREAM)
' \7 O. {7 [5 c" U0 E    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。) q  X2 \) V" W
2.数据报式套接字(SOCKET_DGRAM)& t1 W1 {0 A& R$ m: h
    提供无连接的数据传输服务,不保证可靠性。* Z5 q8 I, {; f4 B" T! Q4 q
3.原始式套接字(SOCKET_RAW): K; ]: ^' y8 Z1 v
    该接口允许对较低层次协议,如IP,ICMP直接访问。
# B. I: p* X5 c0 n$ h) F
% a; ], k2 B0 E0 v二 基本套接字系统调有有如下一些:
. D8 w' {. ]2 ^  z) J& j    创建套接字: socket()
+ v$ o6 x% n( E    绑定本机端口: bind()7 M* c3 J( p% g' d1 X
    建立连接: connect(),accept()
7 M' g+ g/ W" W1 o- E    侦听端口: listen()
3 p& Y( q$ F5 z  |" J4 x- G4 m1 N    数据传输: send(), recv()1 G/ M% \- \; x7 V4 F$ W
    输入/输出多路复用: select()1 [5 ?1 ?& J3 R1 f7 ~2 }
    关闭套接只:   closesocket()% f# m  r7 A$ ?) l" \6 L* L
    ( G2 [. J2 @& H/ e8 }; u5 b
三 数据类型' H) K9 E. v6 k) O
    struct sockaddr* A4 P& Z8 ~- [; M
    {
$ k: w1 ~2 H; m$ y. ?- r! a       unsigned short  sa_family;   //地址族, 一般为AF_INET, i, Y0 ^: H: ^
       char                  sa_data[14];   //14字节的协议地址  g5 h. w- F0 B6 \7 x
    }* k3 x& y+ u, p, R' n

% X; I/ e$ a! {5 @6 A    struct sockaddr_in/ P3 ~: @! [& {4 ?. w4 c- _, ?# w
    {
# j' Y4 A3 w4 L. L7 P       short int                     sin_family;   //地址族
" B$ E' k/ E) Y+ |       unsigned short int      sin_port;      //端口号0 ?2 ~: ?5 P& w! I! \" E" s
       struct in_addr             in_addr;      //ip地址' \1 a: W4 q0 p# G& s# \' E. S6 g
       unsigned char             sin_zero[8];  //填充. O: U2 {' }& B, W( s& W* U3 |
    }1 M  v+ }8 m2 F6 V' X9 N% L
7 U" {9 k" M9 O( }) A* T
四 常用函数
% ~/ Y! c/ i% ~* Z$ T, [& J; x    1 socket()
* q. I/ n( y$ |% H2 d- p       头文件: * r4 F) k* q0 C* U! [1 i- u! \
       #include <sys/types.h>
( x  _4 }! k" Y- J  ^       #include <sys/socket.h>
; o8 C0 U" \+ x       函数原型:
! T2 C" @4 M" Y. K  m$ k       int socket(int domain, int type, int protocol)' H4 M! w5 ]% H0 i# n3 o& R0 g
          domain: 协议类型,一般为AF_INET
# \' @/ d* M- u$ l4 D4 b! A/ p1 J! x% |          type: socket类型
$ k) Z* F3 I$ T) u: i: |5 J          protocol:用来指定socket所使用的传输协议编号,通常设为0即可& Q% ~1 }+ v2 H! M
9 h) w& k. S/ M4 V% Z6 I$ U
    2 bind()& m- m2 n6 {: {; C! h  Z9 p  ~5 o
       头文件:
6 C0 A: X2 c" d9 x0 S8 A       #include <sys/types.h>
; N2 y6 w; I9 T" \! o       #include <sys/socket.h>
/ F# i$ V# w- a1 g, e( z4 E       函数原型:
8 l7 j9 @1 F; ]7 P% f       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
. w. c9 L" T( s5 c: S' e( H          sockfd: socket描述符* Y5 ]8 O5 A! Z) T- m( i( d1 f
          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
' l; [- M1 i3 R8 b          addrlen:常被设为sizeof(struct sockaddr), k3 I/ N. s8 |* ], {
5 B: A6 A1 A! E; @2 }  I, H
    3 connect(); o  v. f5 z- f! e
       头文件:
& \" `; Z, T; S6 p8 }2 o6 D: u5 d       #include <sys/types.h>  2 x3 L% R" p/ E' P$ l/ k
       #include <sys/socket.h>: p& M6 x6 c2 V! S, l9 t
       函数原型:8 M( v; D5 @8 t$ z5 t
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)6 i) d+ A9 w7 n' m
           sockfd: 目的服务器的socket描述符6 A1 H! S1 X* ]2 x( z+ J
           serv_addr:包含目的机器ip地址和端口号的指针2 o: T$ i7 m0 U+ k
           addrlen:sizeof(struct sockaddr)
8 r! b4 Y+ p6 |3 l% P9 ^$ ^( O1 w. H. V  ^
    4 listen()
5 v1 D8 [6 H& b% B1 f6 F       头文件:, y5 T  f% t6 E6 u; {% O( A
       #include <sys/socket.h>
# C: g2 z  B* p7 j$ J, W7 k       函数原型:7 n% t+ w+ x. }4 h+ r
       int listen(int sockfd, int backlog);0 `: ]% P* g, ?6 m+ z! ]
           sockfd:socket()系统调用返回的socket描述符; y4 C/ H1 v2 y7 A$ h9 Q/ v. c* a, i
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。: c3 E5 w2 y! U& c5 }* k
6 n/ [5 W( K! Y$ b4 S9 n/ _
    5 accept()  }  G4 |9 r. ?: G6 r7 G
       头文件:   0 L- j' {# U6 Z- @- \2 ]
       #include <sys/types.h>
$ d6 C# H: G% q8 J9 z       #inlcude <sys/socket.h>; K: w5 n7 K% G' ^
       函数原型:; ~/ t* G& s7 J8 `9 ?
       int accept(int sockfd, void *addr, int addrlen)
: u; M2 x/ ]) C: {  U% E# j           sockfd:是被监听的socket描述符' ^5 J$ p1 e; I1 w0 a6 ^) b6 E
           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
9 n6 t2 ~% f2 x$ r' Q: }1 e           addrlen:sizeof(struct sockaddr_in)4 I: A$ L# U/ Q' z( M4 t; v) B
      
( Q5 y5 i( {7 A# L    6 send()# a* |; z& m. f- A6 F& @8 @( b8 K
        头文件:, H: F" B" q5 b( |2 f6 T, {$ O
        #include <sys/socket.h>, |, A, G7 n( V; x7 Y. B6 E, J
        函数原型:3 @6 r5 \1 o# }$ y/ R, k. C- @* {
        int send(int sockfd, const void *msg, int len, int flags);
, j, ?4 D( ]$ B- y2 s9 U2 v! ^           sockfd:用来传输数据的socket描述符0 B  v) o7 c% p$ g0 f; c: e# p
           msg:要发送数据的指针
( z4 _; P# N2 R8 W) G  [3 d           flags: 0
2 z5 L- Q5 \5 n' E- X      
3 Z8 t2 ?% O+ V    7 recv()
7 v; @+ a1 `4 f. u1 x0 r( X        头文件:0 A' C+ }  `  ]5 f  P! U1 C
        #include <sys/types.h>
- u& ^: b1 M2 @7 Z& H( m" J        #include <sys/socket.h>
5 v9 U5 Z( m+ N) l+ q7 d7 T        函数原型:: l0 \% S6 b# u+ |( X5 h3 n
        int recv(int sockfd, void *buf, int len, unsigned int flags)1 x. ?2 a% o; b7 m( u6 K) m
          sockfd:接收数据的socket描述符
" g* y" ]! m9 _0 Z0 b: ~          buf:存放数据的缓冲区; {/ _6 S+ \5 c5 d
          len:缓冲的长度
0 \$ j0 E( L6 S* Q' P, ~$ Q/ j          flags:0
9 ]5 ^& ]3 }3 u( c  q. }+ E- L9 d' f4 h$ ^' J; H7 Q
    8 sendto()3 Z+ n4 t+ x, V$ l
       头文件:
; u, p* ^. f; d9 W+ r$ c6 }8 \       #include <sys/types.h>
0 V4 h/ `0 E. \  H# Y( W) ?       #include <sys/socket.h>
) G. k& a1 e0 q2 d; j       函数原型:7 G/ O$ d% I7 W
       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);' _; v) b& d0 t( z1 k
        
& e$ e. K0 o# z- J5 L  v: U. b   
+ Q* `" u1 K5 B4 o% _" s    9 recvfrom()4 Y% z0 A* \! k% R! X. R
       头文件:
/ n2 E& ~/ {5 k4 ]% e0 s       #include <sys/types.h>
  l' r2 @2 q8 h       #include <sys/socket.h>
8 H; x  y- |  b: ~1 ]! l       函数原型:
. r" G! Y  j6 z# ^( h% k) M' U' M+ A       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)9 n# w. l2 B/ H/ H* X
# T- @$ j* X- T% Z# z$ {2 |. y: O" w
    * J$ Z$ o" _5 [: O* h
    10 read() write()
- l' I. V+ ~, D, {: n# `       int read(int fd, char *buf, int len)5 k* W3 u% S) R5 P, }& }: I: B0 R
       int write(int fd, char *buf, int len)
  t8 e- E+ P0 B      
3 `/ d% ?( A2 I" M- P    11 shutdown()' P. _! X) n4 b3 n' v' v3 A. |
       close(sockfd)8 U  `' p7 W/ W0 z% X5 }6 g3 c
       int shutdown(int sockfd, int how)
% g& c' h4 n% v5 M# f0 t4 D-----------------------------------
[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等)   
, u; m' E& i; C% @) M! e6 D! b<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
6 L! v) V# {6 d* I. X<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()
* f. C+ L8 }0 @7 I9 `+ I<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
0 z% L' b6 W2 Q<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等6 G( X# w( z' T
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等
' c( `9 l0 P. @<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
- ?! `6 h) k- i* ]% v4 y4 g: o6 R0 L( s) @  O, g
[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等0 n, Y5 k' v' Q6 E# V; Q% y
#include <sys/types.h>      
8 c9 g) I) A7 K' Y
, A5 V3 `1 Y  E0 q6 b( K+ D$ ~* s8 a( K#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons4 j" x! R- ?! s- e$ E
#include <poll.h>             //poll,pollfd
: M$ b$ R7 F, V+ K/ _8 F#include <arpa/inet.h>   //inet_addr,inet_aton
% W' K# A6 a  F4 g. J#include <unistd.h>        //read,write" e) m1 N) m1 b" e) J% l0 |
#include <netdb.h>         //gethostbyname$ l* W+ w% i& F) E) W0 O: p
$ H7 G  a& I( `" B: P8 y
#include <error.h>         //perror
' y) h; q9 c0 b* t& c  e) m#include <stdio.h>
# [3 B' ]& u8 l# ^4 e#include <errno.h>         //errno
% u1 ^$ @- B5 w/ m# G: v! ^2 @$ q% ?. d! n* U$ y: ^# T
#include <string.h>          // memset
, Q% m7 S5 }7 M* ~3 Y#include <string>1 f# K) p! q! D. h9 }" I8 i- ]9 M
#include <iostream>
3 p3 `1 [$ ~; b* Z0 n9 G
  z7 _- B0 _& e& v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-4 18:32 , Processed in 0.123059 second(s), 19 queries .

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