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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:
  W2 z1 u/ x) C1.流式套接字(SOCKET_STREAM)' X0 V, f# L& v/ P* c/ k
    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。
8 h+ R1 q3 P% l2 u* N- }2.数据报式套接字(SOCKET_DGRAM)
+ y2 z9 ~! `- H& j    提供无连接的数据传输服务,不保证可靠性。. b, P/ }0 f7 O8 ^2 z
3.原始式套接字(SOCKET_RAW)
) ]7 o% U- p. z    该接口允许对较低层次协议,如IP,ICMP直接访问。
; _5 D, a8 m% t2 [* M8 H  Y1 B4 T4 V8 H* i8 X% r& L2 b
二 基本套接字系统调有有如下一些:
0 e' [! V% M' ?1 E8 S$ J    创建套接字: socket(). z+ E9 n+ I- a& p& e6 @. C
    绑定本机端口: bind()( N$ w* A( X' v" A6 t- @
    建立连接: connect(),accept()
( n  B* l3 p/ ^% w  X6 E    侦听端口: listen()
; p( n0 ]# W3 ]8 D0 ~- k4 V+ p    数据传输: send(), recv()
% d+ k" Y. @9 O: S8 d* Q8 v    输入/输出多路复用: select()
0 Q  I) G' y& P5 t0 a    关闭套接只:   closesocket()
) C- H3 c" D. m* D4 F6 }( _" v2 g   
/ H- T* k) E: W9 I5 V' W9 s: P三 数据类型
# z8 K( y4 Q; k    struct sockaddr% j8 H, J( t1 q% o/ x/ i, E$ T9 F
    {" ^( U1 Z+ f3 t0 W
       unsigned short  sa_family;   //地址族, 一般为AF_INET
0 l- o( i$ S# U0 C3 w- t2 ^4 r       char                  sa_data[14];   //14字节的协议地址
5 M# V/ a$ Y1 `5 _& S3 N' K4 F    }9 o; `4 t/ `  k) B/ }$ p1 F7 b
/ [! e' a, k3 U/ N' x6 `* Q- L9 U1 V
    struct sockaddr_in0 n. V* i; ~" n1 ]  G  Q
    {# [* b* _  u; m) U9 H
       short int                     sin_family;   //地址族
9 B1 j. W5 S0 U$ f. Z       unsigned short int      sin_port;      //端口号/ r5 X; [6 x( ^6 T' M7 x. v6 L
       struct in_addr             in_addr;      //ip地址
* `( X- h! B9 o! a# t       unsigned char             sin_zero[8];  //填充% O- A8 I' f2 K. X# F0 e3 g3 d. X6 N
    }* q7 U9 l( M5 {
' j# v+ o1 ?) F
四 常用函数9 _2 d/ j! z8 T2 H
    1 socket()' P( n3 t7 t. N* X. Y" e
       头文件: . Y& Y8 @: E! J+ n% F/ V5 V
       #include <sys/types.h>" z3 e6 z6 X  \& ^* J
       #include <sys/socket.h># M/ t6 n& k" ?6 B* B
       函数原型:
9 G- K+ P4 @! z/ J3 t+ ^       int socket(int domain, int type, int protocol)4 G4 D! Z1 b+ Z1 H8 k0 N
          domain: 协议类型,一般为AF_INET
9 g/ W% P7 O: |: t$ S          type: socket类型, n* W5 `6 L- b5 x6 V' r
          protocol:用来指定socket所使用的传输协议编号,通常设为0即可
6 ?/ T. u( ^1 X! y* M
7 }; N( t  b4 L2 u! k    2 bind()/ B+ I+ u( a# M2 y1 m& S- u3 Z
       头文件:! s" }8 F+ u: h& \. j
       #include <sys/types.h>4 `* f0 v# f7 M! N8 d
       #include <sys/socket.h>
" {7 c/ Y, u0 J/ ~! F# f       函数原型:2 A7 I4 m+ p6 l& I2 q# W
       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
: I1 q6 H  X7 ]. M5 r          sockfd: socket描述符0 u3 m* v8 D5 R) B; T
          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针2 E8 m% c+ z& r* W6 y
          addrlen:常被设为sizeof(struct sockaddr)2 L6 M9 O- M, n- z' u

3 o# v6 p2 {9 o5 E! N    3 connect()
+ b8 d# v/ M& s" O       头文件:. H  R: M# l" F9 A( t$ s; e5 N
       #include <sys/types.h>  ; x) {# `, i, i
       #include <sys/socket.h># u( C  f% A+ `5 z- M* Q
       函数原型:: m- T1 h4 P2 P- T7 d: x
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
7 |4 [/ S4 V; y0 c           sockfd: 目的服务器的socket描述符% y2 w; \3 E3 X  |7 y1 j9 G( h/ _5 t+ F
           serv_addr:包含目的机器ip地址和端口号的指针3 _3 t6 k8 m# y: T( [# A& T
           addrlen:sizeof(struct sockaddr)/ m1 m: z& Q: d7 M9 o1 G# [  a
+ v) L: x  u$ d  w) g- F4 a+ c! T* Q
    4 listen()5 w8 C: z2 C% G: f1 @4 A
       头文件:4 |1 B! E9 l4 @& p. p0 u2 U4 y  [
       #include <sys/socket.h>( \! F% p  S) b8 V& L1 Y
       函数原型:! d0 ~+ w) N# W1 t$ D1 d
       int listen(int sockfd, int backlog);
- x/ U6 g3 s( L+ d. H" }4 w( w           sockfd:socket()系统调用返回的socket描述符1 B6 X: N' |  ~' D0 Y; w5 S
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
% y( p" `' w3 G2 F$ m4 P7 G! z* _! M6 r( ], Q& _! K
    5 accept()* q5 V# m! ?: V0 X7 H* o
       头文件:   & E& s- o4 E4 Y/ f
       #include <sys/types.h>
2 o; M) D4 O" S3 o* h7 u+ b       #inlcude <sys/socket.h>
+ u1 ~4 R+ D2 g( b% ]6 i+ t       函数原型:
7 X$ e7 t+ z3 C3 D  N1 O       int accept(int sockfd, void *addr, int addrlen)
8 w6 R$ ~4 ^9 Q3 o; W           sockfd:是被监听的socket描述符$ A& }$ w. X/ v8 X% X9 m
           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
/ X$ V" M; R, b5 b: Q8 e. V7 f* V           addrlen:sizeof(struct sockaddr_in)- I7 `# K8 ?0 y" o
      
1 j6 |! o8 p* d& v8 `    6 send()
9 J( C0 D' M( r$ Q2 Z3 m        头文件:6 V' c" V' Z. b: T
        #include <sys/socket.h>( ~3 D) P) ~& l  l! y
        函数原型:- Q+ e$ @- z, ]. A
        int send(int sockfd, const void *msg, int len, int flags);1 f) G* O, a/ Y1 k5 `; a
           sockfd:用来传输数据的socket描述符
; o- Z* L4 A$ x8 y$ C3 ?# b% ~# g/ q           msg:要发送数据的指针
5 j2 ^4 x4 s& P: o           flags: 0
9 P5 S9 s  [8 k3 G* Q. X      - R, v/ j7 \2 H  a
    7 recv()7 Z" a: k8 ^" p, ]* R- |
        头文件:1 Z; R& j& H! F* S/ p% r5 B, i
        #include <sys/types.h>
. w9 J0 D9 ^: g  N* m! g! u# M$ {        #include <sys/socket.h>" I4 X/ u: P; M3 M
        函数原型:
; X/ B7 R# t# h$ ^+ K8 ]# m        int recv(int sockfd, void *buf, int len, unsigned int flags)# x' X( z+ E+ E( J( ?" C+ s
          sockfd:接收数据的socket描述符
; I% W8 L% k  [/ E' E8 h$ H          buf:存放数据的缓冲区# R4 g, r1 X; r" M0 l
          len:缓冲的长度
1 I  _; g1 K6 x- n8 ^4 h0 ~  _          flags:0
" F, i7 u8 Z' L& G  v
) A: E: ~+ D) Y! p9 H    8 sendto()1 @/ K* a5 H& Z
       头文件:$ `& r2 q5 i! V) ]4 C
       #include <sys/types.h>
) w5 R  c- Z8 s. t7 X       #include <sys/socket.h>, v1 c7 B7 O9 U! ~) k
       函数原型:& o4 i2 Q, j7 d8 @. L% S9 a) X
       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);8 F. S2 i; r, p- c/ t# a' S) {+ P
        
+ i% _# ~; F0 @2 P7 `! \' `& a6 {   
4 H2 W: n* S0 N6 ?1 o/ Q    9 recvfrom()* {3 T; m+ u3 l  S/ |
       头文件:+ P; i) e; J7 d, s; `! g  u9 _
       #include <sys/types.h>
5 j, ~6 y/ a! u$ O5 M       #include <sys/socket.h>
! N. @5 |' W( \& D- q* ]       函数原型:: j% T+ Y' Y0 [# M/ o7 t- d' j8 g3 Z& D
       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen); n! j2 O8 _7 q- L3 S
8 V/ B7 }' `9 e' T5 [3 T9 U
   
% K# b/ U8 N9 V! `$ g    10 read() write()
9 a: {7 J4 W& K# V8 X4 q: K       int read(int fd, char *buf, int len)
; f, a: A$ H& h. k8 G$ o       int write(int fd, char *buf, int len)
9 a( M9 u4 g! _3 M       : l5 U$ d+ ]: e3 u
    11 shutdown()4 s6 M9 q& z5 B
       close(sockfd)! \' p) B) I: O/ O7 p$ j3 Y0 X
       int shutdown(int sockfd, int how)
& f5 S# i; }  J9 v) B- 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等)   
, Y4 o/ W6 y9 p$ V' i/ \; C<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
. Z: e2 s: K! Q, x! [  T3 }<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()3 X1 o# C! G  k/ s* [6 W3 ^  B3 Y
<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
/ j8 v1 }7 r1 h. P<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等+ T* T+ Z( q0 L+ u& L! b: U
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等7 P1 P/ M4 u2 [% [& L) w
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
+ i' `0 f. s" F
: y& C: b# D/ o[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等' p% c7 x4 L3 B$ J
#include <sys/types.h>      8 o2 A5 @( ~$ }. M3 N

/ ~# c+ L5 q1 s: Y  A  u6 g& t$ d#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons
5 L' C4 W! G! N, w9 ~# ]7 Y#include <poll.h>             //poll,pollfd
2 r2 ^5 e7 w9 ~, M. a. W#include <arpa/inet.h>   //inet_addr,inet_aton7 u% `' r9 [9 ]' L
#include <unistd.h>        //read,write
0 M( |8 ]& C* x6 d5 h( m* x#include <netdb.h>         //gethostbyname6 S2 I$ q4 U' g; h  ]4 |0 v* I

7 ?1 J# G0 H7 ^; o#include <error.h>         //perror. y, B  U% R$ j7 }  z0 q% m
#include <stdio.h>
  k: m2 d' u) Q0 e2 |) ^# `#include <errno.h>         //errno
0 z) k# U, ]& T$ R* T! ?( X- r, n
$ t: U$ I% B: `, \9 \#include <string.h>          // memset+ D+ u- `5 `& |3 |; j
#include <string>
  c# G7 r4 X7 C+ p2 t$ K! [" f; W0 }#include <iostream>

* {  R7 _, s5 S! l0 O6 h
- D4 F7 u& \& h' o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 20:51 , Processed in 0.055818 second(s), 20 queries .

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