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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:) \' a9 B+ i- a7 L8 |
1.流式套接字(SOCKET_STREAM)
) T. W' S$ J! @: G, b, u    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。9 z! P' Q  S" r
2.数据报式套接字(SOCKET_DGRAM)
9 I9 M% X+ A) a5 \: O( \8 \    提供无连接的数据传输服务,不保证可靠性。
1 G( n& B/ a, I4 Z3.原始式套接字(SOCKET_RAW)0 W2 l; k; i* Z+ j& y' O6 H
    该接口允许对较低层次协议,如IP,ICMP直接访问。& r; F5 z2 D9 h
1 A/ n$ Z1 p2 _8 z+ I1 D
二 基本套接字系统调有有如下一些:: T2 Y7 s3 ~: I) ], t2 ^! I6 k
    创建套接字: socket()8 R: X& \* Y9 A' \: R8 |: u
    绑定本机端口: bind()
, t. M3 E* m! ]; n+ ?) r    建立连接: connect(),accept()
5 r# P( P- F# J# t: m5 g1 c. t    侦听端口: listen()
- m  p+ n" x. T0 h    数据传输: send(), recv()
+ D$ Q; y8 h) c; U! p    输入/输出多路复用: select()
, e. u$ M' _1 X( U5 n# p    关闭套接只:   closesocket()
( h# ^3 y+ N) X5 B" G9 Q( R    + m/ k; E# |/ v8 J% j+ E
三 数据类型
7 I& ~) g; _- D0 I0 t- C' J    struct sockaddr- D; Z4 U; j4 w/ h9 {. A! u
    {! B/ o3 i; z3 ^8 y" }8 w0 D
       unsigned short  sa_family;   //地址族, 一般为AF_INET
( F6 R% p! f  s9 q       char                  sa_data[14];   //14字节的协议地址
: Q- \0 T! x8 [) `' l7 r    }
' h) N9 d. b  ?: F6 T9 ~9 K1 g" U' P9 a
    struct sockaddr_in
: M' X+ L, `) K( a6 h; R    {3 o4 ~8 v# m4 w; O; d* _! n
       short int                     sin_family;   //地址族
& f7 X9 M# O4 M5 B% N; f       unsigned short int      sin_port;      //端口号
3 n) }- X7 j" X! R" _, Y! |       struct in_addr             in_addr;      //ip地址( y4 H& u& h5 d/ }( X+ K" T
       unsigned char             sin_zero[8];  //填充
" y6 ]+ U7 T6 x5 @, a# {, C6 H    }
; }( U7 m+ M/ ^* i& Z
: V8 k4 j. {: l, c; g" E四 常用函数# y3 `& B# ~4 C/ \7 `* T7 K3 z* Y# f
    1 socket()
; ^2 z: L1 v0 h9 A0 e6 L  @( _       头文件: : v7 w. X1 U- N) D
       #include <sys/types.h>+ k8 v- F: `# t8 i1 p$ D
       #include <sys/socket.h>7 Y3 ]# {* U$ G; W; b" k" j
       函数原型:
. A- R. l3 V$ [4 i5 _  M       int socket(int domain, int type, int protocol)4 o8 W$ x+ L. F/ q( L$ y/ E
          domain: 协议类型,一般为AF_INET
- s/ M8 f7 t+ _, p8 e( i2 s          type: socket类型
; N! Z' m4 Q* I8 n" T) r          protocol:用来指定socket所使用的传输协议编号,通常设为0即可1 P+ J9 d( S' c4 O! p

7 P8 E/ m: @+ d    2 bind()
& Q/ ?. L# \) c4 `  U+ S6 D       头文件:
) b" F; p4 C; W$ ^$ l       #include <sys/types.h>
% }" l. |3 x7 |2 Z! ^3 c& O       #include <sys/socket.h>0 t) Y, ~3 ]2 e% c! o! w5 w: S
       函数原型:
! E( E& m4 b) p       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
* X9 Z: F3 {) p" _  ]9 q0 K  y& Z          sockfd: socket描述符
: V3 y- r0 I. _& f% F2 [% |          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针4 F/ ~, X- F1 \4 `) t. }
          addrlen:常被设为sizeof(struct sockaddr)
- ?  M0 B0 x3 F* S9 B  ]$ K
* d$ f) c5 P% W( c! h5 ]1 Q    3 connect(), w4 J- B1 @4 ]& u8 R
       头文件:& G: Z: f8 b& V% S0 a6 T
       #include <sys/types.h>  # J5 V+ P4 Z6 f6 }3 ~7 A
       #include <sys/socket.h>
5 c/ p2 Y5 }9 [* K       函数原型:& _6 [" ]/ B/ O1 J/ A
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
1 b* j4 _7 `# t           sockfd: 目的服务器的socket描述符1 ~3 \" D; G. a0 w/ |6 h
           serv_addr:包含目的机器ip地址和端口号的指针* |& u: |1 O, D/ c$ i' k
           addrlen:sizeof(struct sockaddr)
* k1 Z" A$ C6 l6 O2 }2 R  u+ g3 ^3 p- H( I! A
    4 listen()
3 E4 j* p. y9 W  x% b  g       头文件:
- {4 l* I' ^9 e- ^       #include <sys/socket.h>
8 o8 k8 P+ g. Y       函数原型:( G+ J7 v! B7 ~
       int listen(int sockfd, int backlog);
  C4 ^0 f" G& ~1 P% o& V           sockfd:socket()系统调用返回的socket描述符
3 F1 p& s/ q% L* p" r           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。1 j2 i' v3 v4 s& P

/ n' G" R- I) o, H1 u, M: P- {    5 accept()
% M; O2 r+ i0 _1 |       头文件:   ' ~. r0 ~+ Y0 g' C4 A- |3 R2 Z3 N
       #include <sys/types.h>5 m, d6 L' _+ u6 R6 @2 Q' ^
       #inlcude <sys/socket.h>
' ~  n) \  i+ e% _0 E, \5 |       函数原型:
. W& c4 G" X  N" A5 s% ?       int accept(int sockfd, void *addr, int addrlen)+ h4 L3 `: d9 h$ b& O- q7 q$ F6 b
           sockfd:是被监听的socket描述符1 c6 Y$ N4 [3 F" s7 K* H2 F1 j9 t
           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息+ |  Y! s- O5 {4 X) Q- t8 V
           addrlen:sizeof(struct sockaddr_in)5 i) C4 i( O5 `$ U  l
      
! j) A7 |& C5 D& X* _9 e    6 send()
5 I2 r4 u8 F& K        头文件:
' [/ c2 W9 E: [# o- s        #include <sys/socket.h>
2 x  p( n/ q5 a4 ^        函数原型:! C7 Y+ Z, K6 J3 ^9 Y
        int send(int sockfd, const void *msg, int len, int flags);
0 o  m* D- b6 b, @) D5 n: H           sockfd:用来传输数据的socket描述符+ |1 `& |! P* f5 C
           msg:要发送数据的指针 3 ?1 ^2 [6 G' J* _& R' n
           flags: 0. d2 X; I; @" |
      9 o# g" f: B0 u; `% F) A
    7 recv()
  ?& r  n% K( f0 V. u2 Y7 E        头文件:
; k4 }( [! u  \. X        #include <sys/types.h>: W5 K- |5 I- X; A
        #include <sys/socket.h>
, x  ?# J+ |3 a, H9 l1 F$ h0 [        函数原型:$ N/ M% u6 x# G8 @) g1 w
        int recv(int sockfd, void *buf, int len, unsigned int flags)) k, V/ @8 e# q5 C0 M5 V6 v
          sockfd:接收数据的socket描述符: O# {; q% ?5 T0 l/ X5 E% z  U; d
          buf:存放数据的缓冲区
- q0 E: X+ F* b1 w          len:缓冲的长度8 I- j/ c  |( F% C( |. l
          flags:0
2 [0 j- V" V$ H5 g8 \
2 _4 O- D1 ~& D$ V5 z    8 sendto()
' [6 x/ {$ N) T4 e( r% r0 S       头文件:
% L' T" Y. [. i9 g2 `6 s       #include <sys/types.h>, |% B4 M: N. L6 b9 U0 k; p& h
       #include <sys/socket.h>
/ U' U. L' y1 H0 |! @7 U  [5 G       函数原型:
2 }1 ~  i. A+ ^" k8 P7 j       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
* O$ w0 j9 D; t- G: F+ q* y+ @! `! Y        
; \8 L5 u: }1 o    7 A% ]) p( N! ], I5 X& p: ?2 o9 u
    9 recvfrom()' D) }, [5 I6 ^. H- R' S, C# r
       头文件:& D3 x2 \1 q! H3 i  ^0 e* W
       #include <sys/types.h>( o+ y' M( U9 S# R# j  F. I1 Z/ E
       #include <sys/socket.h>3 {! o9 {$ \) T- X9 o' e
       函数原型:  K, z' T! F: k: t: l$ i6 U- _
       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
3 l- O' z% @  D3 [9 B7 E
8 H9 g. x3 m  e, K6 A6 K   
, \" j, z9 |& S6 Q. T. J/ Z! }4 }: D9 E    10 read() write()* C! k9 y. N2 f* k& M; h5 b
       int read(int fd, char *buf, int len)
+ i7 o" z, q; g& A" K% H1 R       int write(int fd, char *buf, int len)
6 f7 p" m* p$ ^. W% I& @       7 O7 q6 l5 j+ n; A# N  s+ y
    11 shutdown()* `4 a$ {1 M5 A, F6 R1 L; a/ n. X
       close(sockfd)9 y  \$ Y/ b) D1 Z' \% ]5 u
       int shutdown(int sockfd, int how), S7 s: m  D% k/ Y8 h+ 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等)   
' u6 h: _% ~, U/ W& O# H<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
" V' a- i3 N: R" L<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()) s! }9 W- n9 Y% N  G5 o
<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
! b* `: k" _0 ]2 C* X& u% E0 W<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等- N# q. C) m  N
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等/ U  t/ T. X- z" z
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件7 U; Y! I2 g. ~/ W) Q
" _) h: E+ o: D& V, X1 @* `# Z
[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等6 p$ S9 n( L4 {) Y5 U
#include <sys/types.h>      $ A6 E& k: i! Q5 t; U, ~
7 J5 k% B% G/ `6 X
#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons
6 O9 S' Y# k' W1 E#include <poll.h>             //poll,pollfd
  t! T2 p7 C/ U3 I4 o3 a0 ?$ o5 s1 M#include <arpa/inet.h>   //inet_addr,inet_aton
9 e' Q7 \! ?. H$ x5 ^' G; J#include <unistd.h>        //read,write
- T! O; Y$ K% M) R" i6 k#include <netdb.h>         //gethostbyname
7 I8 I/ s; N' R5 R3 X: C
* a2 u) W7 P* r/ w#include <error.h>         //perror. \) g' K# G2 W; p
#include <stdio.h>
# m; @& {4 C" A: n7 a5 C. k#include <errno.h>         //errno
  _; E$ f6 ]) G, d) g$ D/ {5 R. K5 K1 |6 T7 a5 k5 K
#include <string.h>          // memset
) I$ a6 z6 f) `. u9 M- j/ [#include <string>1 t/ t6 c& M! L+ M, t. Z
#include <iostream>

& _: S& y% I+ K9 U9 y& s# Q9 h. A( l/ N9 o1 L0 J/ I- \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-22 04:11 , Processed in 0.068857 second(s), 20 queries .

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