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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:+ b, }# q9 R2 z1 V$ g
1.流式套接字(SOCKET_STREAM)0 b: V" V/ k/ U; Y9 V  A. Z
    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。
/ `8 K: n2 G& x5 P2.数据报式套接字(SOCKET_DGRAM)
: Y0 ~$ m4 x6 E; R4 a  C/ ~9 g    提供无连接的数据传输服务,不保证可靠性。
& k& g( V& k( C3.原始式套接字(SOCKET_RAW)0 K% H4 G7 f, O& v; n0 k& X4 n; p
    该接口允许对较低层次协议,如IP,ICMP直接访问。
9 T6 a; ]& t/ @6 m- r9 Z2 y! D$ Z% y6 \6 c* i7 A
二 基本套接字系统调有有如下一些:( K8 ^' }9 B. Y8 \
    创建套接字: socket()
& w* X8 j  f) I  L- {+ m; Q. p0 @    绑定本机端口: bind()
, S; N  j# D" X( Y( x* X% ^. t    建立连接: connect(),accept()' X4 E4 q! A& \& m- S
    侦听端口: listen()
' W) W0 e" a0 f) a3 [  d6 Z& b    数据传输: send(), recv()
0 h* T/ y$ u: P! D$ H    输入/输出多路复用: select()
" d6 h& I4 `/ T6 }; q3 E" }    关闭套接只:   closesocket()
  f9 s1 F: p/ t    6 D% x4 r4 H" z% z3 T4 W0 J
三 数据类型& h' u+ ~8 \0 X" e' y
    struct sockaddr
, ^3 W; {9 r$ [+ D/ e0 }    {' C3 H7 S6 i: L+ Y
       unsigned short  sa_family;   //地址族, 一般为AF_INET+ U% n0 D/ ?2 C, P
       char                  sa_data[14];   //14字节的协议地址
. K$ ^9 E* |4 C9 j# k    }2 y6 {  p. f$ k5 I1 u( m( M: F2 M
( O. {5 c, u# J: `/ C! ~4 ?/ Y
    struct sockaddr_in0 W. F5 P0 Y+ D+ U7 `% i6 v6 i& o" r7 ~
    {
  s  s# B+ J% j/ m; o* b. f       short int                     sin_family;   //地址族* {+ k% a! `8 o
       unsigned short int      sin_port;      //端口号
0 R2 {- K  n6 ~8 C' T6 N       struct in_addr             in_addr;      //ip地址, q- A; l6 _( k8 V, }/ I
       unsigned char             sin_zero[8];  //填充2 L! [2 Q6 a+ ]
    }
% W* b# t, h1 d# v, f& P$ F
5 i6 E- `9 @, o+ P4 |四 常用函数2 k/ I3 K: c) R
    1 socket()# \1 {8 x- D8 a) R, O9 R& ?5 _
       头文件:   b$ j" n; B. }1 j% O- l: V
       #include <sys/types.h>
6 I. ^# X' G, {5 J2 d! O! X2 }       #include <sys/socket.h>
0 x& o3 U8 n! P. d, d: ~       函数原型:# b7 H* j1 _/ S5 ]9 V7 |5 Y
       int socket(int domain, int type, int protocol)
+ |0 ?0 \9 ~2 M          domain: 协议类型,一般为AF_INET
% z6 D/ e! S3 T( C& g          type: socket类型! O. ^8 e. H7 N9 s2 `/ @! K3 F5 x5 {
          protocol:用来指定socket所使用的传输协议编号,通常设为0即可
, |/ y& p3 z3 }' _: `7 A( Q
6 _7 R# K+ g) F" f+ L    2 bind()
" t4 `( C5 h  Y% B* N       头文件:
2 F9 R  o/ a, x. [/ R  j8 L       #include <sys/types.h>/ I( c) j* N" K3 M7 W
       #include <sys/socket.h>& \1 K. f8 Q7 t9 Y& @3 ]
       函数原型:
5 E9 D5 W2 k  h/ _       int bind(int sockfd, struct sockaddr *my_addr, int addrlen): I5 M# c  o8 K2 i- G
          sockfd: socket描述符) h2 |8 A4 F& [  M9 W8 q" F
          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针& _3 k' k, U9 P5 n4 j# N4 t
          addrlen:常被设为sizeof(struct sockaddr)
( k3 r1 q0 ]' }1 r( E0 ^
& o; J9 _6 l: e0 V( D) R0 K    3 connect()
; d) c2 L; J2 J1 o/ q; w' H       头文件:2 A0 s! g5 ]( x9 i; I6 t) X% P
       #include <sys/types.h>  
6 C6 ?. P! r* T: j& t       #include <sys/socket.h>" B% f# I: P: P! X
       函数原型:$ z. ~% d! m, _7 [5 G5 D
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
1 K* N# I8 O- ~  C$ n! _9 Q           sockfd: 目的服务器的socket描述符7 N# G0 c% N# @  ?: e, }
           serv_addr:包含目的机器ip地址和端口号的指针
- |! W& f/ V6 v& B           addrlen:sizeof(struct sockaddr)+ Q& D, Q: W. m( ?6 j

, d$ _$ u% ^0 q9 A; K/ r8 |    4 listen()& u4 n0 a2 s" q" j. J: j  ^$ j
       头文件:( a' P9 ]% d! @; B3 T+ N8 `
       #include <sys/socket.h>( b' \0 D/ X$ R, ^
       函数原型:8 z8 z' K+ J5 k  s! E2 x1 L8 _
       int listen(int sockfd, int backlog);/ m5 V# a. X& _/ K1 I' ~
           sockfd:socket()系统调用返回的socket描述符  E; ~* D2 X$ L5 }# A
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。% S1 Q8 H8 }1 i( `& @1 }9 f
# N( n5 U* I# Q' g
    5 accept()- d. E. a/ g! `6 s9 A) i; ^
       头文件:   
  b( h. O% n. s. u; O# l4 a+ `6 b2 p       #include <sys/types.h>
" |# f4 V- V) ?       #inlcude <sys/socket.h>
( \$ u5 A0 U3 O: N# C  X& a       函数原型:- _) w7 \/ s, p
       int accept(int sockfd, void *addr, int addrlen)
5 E, ?+ s0 w, y* ?2 [3 g           sockfd:是被监听的socket描述符+ ^+ ?, `/ R! n; o3 }
           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
4 Q. c7 |) I0 Z+ w& C           addrlen:sizeof(struct sockaddr_in)/ [1 [  }. n/ B+ J
      
+ M% c# A: r) |( X    6 send()
3 ?# Z8 n  m) P+ p' T        头文件:0 f9 B9 H. p0 K5 L3 F4 c8 `
        #include <sys/socket.h>
, ?) T4 y6 ?4 ~* U& {4 s; ~        函数原型:
8 H0 g: S7 Z2 ~. O- j8 O. j        int send(int sockfd, const void *msg, int len, int flags);
8 D: q, @( X* I2 Y# a$ L           sockfd:用来传输数据的socket描述符, y% H* s: [3 V) ]3 g
           msg:要发送数据的指针
2 r) D/ c( {; o2 A- A8 {% }           flags: 0
& H! V. p( N/ M/ b2 B      $ ^6 j8 b7 N% p* O9 s, J* c; }
    7 recv()
8 z5 A# I' h# {        头文件:+ W& t, X) j. _6 D* K
        #include <sys/types.h>' t) c, C9 c6 ~
        #include <sys/socket.h>
3 F5 Z/ `) u  u& _/ Y        函数原型:7 C( L/ n7 Y3 u# N( a7 N
        int recv(int sockfd, void *buf, int len, unsigned int flags)
' R1 M/ Q1 |4 T' f0 Y$ w% |( J          sockfd:接收数据的socket描述符6 V% S( w" S0 y
          buf:存放数据的缓冲区$ }: G0 T! T. j
          len:缓冲的长度
% d6 A5 z7 `# T" {+ t6 X2 V          flags:0
- I5 a0 ^8 ?9 M+ |' I+ q
9 w* K, h5 ?1 E4 v/ K    8 sendto()& ?$ p6 @& x* ^! f% m
       头文件:2 P1 {' u$ @' o3 H7 g
       #include <sys/types.h>/ \; h3 @0 i. \* ~0 m' p
       #include <sys/socket.h># b. C3 `, D8 i2 v# N4 e
       函数原型:* _/ s. m) g# |7 n
       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);1 ]: d6 `4 p. h
        * G7 S0 v. R) Z. [- m; c
    * P8 {- n* B% _$ }4 L; y* N( m
    9 recvfrom()( _8 p; t8 W% ~( Q/ T2 o
       头文件:5 B* V( v( k- T+ B; n; c; o: P
       #include <sys/types.h>( Q$ t+ Q0 R7 Y4 t0 K
       #include <sys/socket.h>
3 I8 m4 h2 m$ _" _       函数原型:
1 ^* d5 Q( d7 f- P/ {" e       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)! ^+ k. p/ P  z: L! q, a* {
7 `4 J: H( |- i7 U6 i& \& x1 g
   
7 F4 v6 {" E. A' @- x    10 read() write()' R4 A$ Y* `! P! I4 j4 i
       int read(int fd, char *buf, int len)+ O' A' n% ]/ A6 w& }# P
       int write(int fd, char *buf, int len)
5 h* n9 C: }' t( y$ y' Q% s  X      
0 A" L( G3 n. R" e    11 shutdown()  A- b$ n1 r6 T0 t2 N
       close(sockfd)
0 s+ t. |  F* |2 \: j3 w       int shutdown(int sockfd, int how)/ F. c0 d1 D+ b, L
-----------------------------------
[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等)   
: ^* t/ d5 u9 P) B. _4 D<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等) r! A) S* l- K/ x" o( `! p! D- o
<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()- z% X4 }$ G/ f: |- q
<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等1 J- `1 Y1 T# p; r$ `% H9 E
<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等0 n& I8 i; F+ I1 n
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等0 h$ O% f* K. |* t
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件) @3 p6 }* Z+ k8 Q2 q" n$ l

" O1 L7 w# @# o2 y$ h9 Q[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等
! N. T1 W" A. C" G4 O: g" g+ o#include <sys/types.h>      9 f: M5 r  d3 H% x* W3 ?
6 l# M4 g7 T3 `0 e; ^
#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons$ Q% q# ^  B) S' d
#include <poll.h>             //poll,pollfd
( z; r- \& ~6 }* c; }#include <arpa/inet.h>   //inet_addr,inet_aton. A% b  S+ S" B% D
#include <unistd.h>        //read,write# S% j7 n$ ^) ?0 b/ ?
#include <netdb.h>         //gethostbyname; q( x, |9 P# M% f( C) `

# E, _  x$ C3 T8 E6 \2 d#include <error.h>         //perror
/ `  L- S: l3 ^3 u( Q% z& x#include <stdio.h>
- W" |+ e, f9 C  C0 n9 |5 s#include <errno.h>         //errno$ Z& n& @  Q5 ]1 Q

5 O$ p: c# ?4 k1 {* Q7 [0 v/ H4 Y4 i#include <string.h>          // memset9 G3 ~* D, S3 x7 E" U  }6 {
#include <string>5 z4 U  r7 a7 Y
#include <iostream>

. d# r: G. s/ X1 H3 Y0 i1 @* g3 @, h( ^4 B- |7 c" z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 00:00 , Processed in 0.054804 second(s), 20 queries .

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