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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:
* V) i7 V- X: r* G1.流式套接字(SOCKET_STREAM)
0 n1 }: x7 g1 K9 x; \2 i    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。9 D( I& v2 t( B8 \! O0 c! C. W: n
2.数据报式套接字(SOCKET_DGRAM)' B8 p! z. F( j6 @! c$ h" l: v/ u
    提供无连接的数据传输服务,不保证可靠性。
6 m3 @" R; M6 z& n2 m) [  o3.原始式套接字(SOCKET_RAW)/ h8 C! f2 }2 l
    该接口允许对较低层次协议,如IP,ICMP直接访问。$ E# ]- M$ h8 }9 I0 V2 {
4 N. D  G7 \: \. m* ]
二 基本套接字系统调有有如下一些:2 C8 W; }5 a8 y) j# i( d- H  W
    创建套接字: socket()7 R% B: q  M$ d3 Q% j" x
    绑定本机端口: bind(), I0 J/ a& y0 R# O9 ?& Q) C: }
    建立连接: connect(),accept()
% Y( v8 d# @0 B' K: T0 T% I    侦听端口: listen(). ?3 y/ i3 G- S* ]5 Y( R
    数据传输: send(), recv()
! ~: W6 q7 k- X; l    输入/输出多路复用: select()
) v$ O9 D; N, s# P: V    关闭套接只:   closesocket()
8 o3 T* B& t/ v( I9 O    " }% B6 Z# [' Q- w
三 数据类型4 ?  N2 n$ `7 Q: z" @2 {
    struct sockaddr: r4 d" S4 r/ y% P0 @
    {3 e" M, I8 `' V. }0 E
       unsigned short  sa_family;   //地址族, 一般为AF_INET* K/ u7 [/ ?# ]6 x, d. ]' A! n
       char                  sa_data[14];   //14字节的协议地址
/ E! K1 A7 v! w; m    }0 f/ l3 N4 F, k" \

7 s- o, w7 K0 f5 C    struct sockaddr_in+ B+ i3 Q7 h( h. {/ A+ _# u
    {- l# P* @( q6 U$ {" U
       short int                     sin_family;   //地址族
( O4 ~, J1 V8 ^+ J; [2 j       unsigned short int      sin_port;      //端口号( q- c+ G1 Y( l3 I, `, I
       struct in_addr             in_addr;      //ip地址( G+ @9 N/ p$ j9 w! f
       unsigned char             sin_zero[8];  //填充+ U; i! F+ i8 d. M# Z7 X4 u6 Z
    }
5 m& B5 M* U, `( z" p, B% Y9 s2 t& }7 S  c% l
四 常用函数3 N# T7 t/ V4 B9 x
    1 socket()
/ u; k! A5 u1 x9 J       头文件:
( ~2 c$ u5 X2 a, C  }       #include <sys/types.h>
" N5 T& d" l2 i" x0 E       #include <sys/socket.h>
9 w5 g$ p# ]- k$ f       函数原型:
; P! |4 o% f: r; S9 `) b       int socket(int domain, int type, int protocol)% U8 k- B& e3 X4 t5 @/ N) p. V  Q/ I
          domain: 协议类型,一般为AF_INET
6 V/ D1 ?: a" u- `) i* x2 }          type: socket类型
* C+ \9 z, M; o2 F3 R0 b% j          protocol:用来指定socket所使用的传输协议编号,通常设为0即可
* G# b  [: C6 D& Z& h. B
$ B# r0 q7 {- G    2 bind()! T/ y+ d$ Y4 M2 w: J
       头文件:
  o- c8 d! D8 [, H       #include <sys/types.h>
2 v5 u7 F& t  X- }       #include <sys/socket.h>1 R6 I5 V7 n' o1 R, k
       函数原型:
  O; U( s1 y, X' n" W; B# P# r       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
2 C* e2 S2 u* S+ [% Y1 d6 B5 |          sockfd: socket描述符, b1 i- s, y' q. u
          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
' o2 n( e3 [9 s6 H8 z          addrlen:常被设为sizeof(struct sockaddr)& a3 \# ~( w/ @/ T, D$ F4 d

, e- w$ i( L% D. i4 {* N    3 connect(), o1 ?+ i( o, O$ }) p
       头文件:* y  ?/ Y" X- `% }
       #include <sys/types.h>  * f' l' f) u% ~& Z5 g. w' i( @
       #include <sys/socket.h># X7 z' h$ s6 m+ ^) g' f' V
       函数原型:
2 J( C. w3 t$ V9 Z7 a7 F( ]. M       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)  n7 i! E! _) k$ S5 k
           sockfd: 目的服务器的socket描述符
9 @' L8 I0 H0 R6 J4 E           serv_addr:包含目的机器ip地址和端口号的指针4 ^% X7 c  Q7 D2 Y) e( h7 d
           addrlen:sizeof(struct sockaddr)6 i: W- x1 y1 a; \

+ k5 a$ Q3 d# Q. {5 `/ j1 ?3 X    4 listen()# V5 o# U3 {6 S( n
       头文件:8 H5 X2 F: d1 \' e! ~
       #include <sys/socket.h>
( @0 A+ K( \6 _% k# Z0 h, R6 O; ^       函数原型:* Z. m9 R* ?+ B. V$ s
       int listen(int sockfd, int backlog);
% p8 e1 X! c( i& t0 m+ U           sockfd:socket()系统调用返回的socket描述符
; B# U, a/ @' d) d9 U# @           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
0 Z; t( g" ?/ J) p% _
1 C' Y' A6 s" c: b2 s8 b    5 accept()2 X7 p+ n% x- Y; v
       头文件:   1 Y0 ~' [6 M6 p5 m/ W, j) c
       #include <sys/types.h>
8 i; ^) u, d8 |9 F4 o6 x: }+ j       #inlcude <sys/socket.h>+ @1 a4 Q* P' S9 J( o+ j% d, |/ {
       函数原型:
& Y* O4 _& W7 m9 d; ?# f/ D       int accept(int sockfd, void *addr, int addrlen). v2 V0 |" ]$ W; Q
           sockfd:是被监听的socket描述符
4 I& T' B& T0 H4 V/ H) m           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
8 a7 p. @9 S: l" f           addrlen:sizeof(struct sockaddr_in)
6 ?7 N' I& R8 b/ ~9 }' F8 ~4 W       . v  G4 y! Y3 J0 N7 e3 H8 n- B
    6 send()& V, \+ U' o; z8 T5 h# d
        头文件:6 S& \: Z4 D2 S0 v- B  C0 V
        #include <sys/socket.h>
% C% ]9 m  j6 i. u. A$ c2 [        函数原型:
; P1 x) i) E4 D# w: V# D; _! y) W        int send(int sockfd, const void *msg, int len, int flags);
: X% G8 p- c: d, `6 ]; h. A           sockfd:用来传输数据的socket描述符8 k7 o2 |% F" v" p" C) L. a
           msg:要发送数据的指针 * d# f8 d9 n+ E7 u5 v+ R
           flags: 0! q+ ~" w1 W: K8 J( |3 Q+ ~
      $ P! q6 D7 J5 Z- s5 o- }( x
    7 recv()
. w3 A) N6 V( w8 v6 }5 y5 a1 j        头文件:
7 z, n3 t( }' u  k        #include <sys/types.h>7 Y& _; C: T# f7 J" Y
        #include <sys/socket.h>: b; v+ Y" P) }, q3 E
        函数原型:7 R9 L7 K9 B5 K( p
        int recv(int sockfd, void *buf, int len, unsigned int flags)
7 p3 t4 [1 s* ^. c# Q! B          sockfd:接收数据的socket描述符0 Y* ~- Y9 a$ E8 d; `0 Y; F
          buf:存放数据的缓冲区
8 ^7 `! L& ]  H5 l1 ^: _3 ^          len:缓冲的长度8 h" F; T. N; _6 T7 G
          flags:0/ I- A! t( h! x, X
/ G  N( N: X4 n( z& g2 g
    8 sendto()( ?6 b3 d8 t+ z1 p5 Y
       头文件:. w6 K. b+ ]" }
       #include <sys/types.h>
+ r' [2 `! @/ p5 [       #include <sys/socket.h>  s1 G: E" c: L# e) i; }
       函数原型:
! L2 o: ?3 |3 z       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
4 ]1 m( D2 ^3 f4 r        
/ u) @! X3 |; i# ?, `7 ]$ [    * O0 t) ?' k0 ?& ]
    9 recvfrom()
* y- N9 ~0 U4 }2 E/ V/ \3 ~" X       头文件:
' {% Z  F) M. {; W2 \- p8 x       #include <sys/types.h>
% b; w0 V9 c' |5 @3 K       #include <sys/socket.h>8 S# x0 R) u4 m( C0 p$ b% H4 X  R
       函数原型:; a( M3 Z0 v7 f+ T& T% q/ V" o  P
       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)' N6 m' ~, L6 l
  s, I" v$ N) I) u5 s: N
   
) B) F+ v8 ~% }    10 read() write()8 q  r0 L% q* x7 o
       int read(int fd, char *buf, int len): g# R% M7 x; I  n: _
       int write(int fd, char *buf, int len)
! q8 b0 n+ p3 o* k       $ }( f$ C6 V* `1 ^
    11 shutdown()- @. t/ I7 C, C8 X( Y
       close(sockfd)7 ?+ o# L; \5 r
       int shutdown(int sockfd, int how)
& O: B  n! n, o/ L; M-----------------------------------
[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等)   
9 i! {' `  P- I+ Z<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
. ?" C3 S' q5 x0 O. f/ q' n. Y" x/ Z% |<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()5 a+ f; |. O* y4 s3 s5 q+ _
<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等9 p$ R! G) [$ V. \/ w; C2 }0 P: P
<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等, X0 V. O9 s! u  ?; D0 u7 Y
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等$ `  h& ^" Z4 v8 n1 Z
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
( i- A4 Y5 S0 W# m0 W7 O3 z# }% ^8 h4 }% P* D7 Z% X
[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等5 G2 i* K) W* d6 q% D' Z: l/ C
#include <sys/types.h>      
4 f! Q9 p1 V; a$ D4 j! Y0 a% ~- W' p) w4 I/ f& F8 J
#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons, c  G5 K0 j- y. l
#include <poll.h>             //poll,pollfd3 m2 h! V+ O6 K. e
#include <arpa/inet.h>   //inet_addr,inet_aton
2 u: R3 v( C# N& T, ^! ^' P9 R- O- {4 S#include <unistd.h>        //read,write: Z1 R3 P; H; ~- [, M
#include <netdb.h>         //gethostbyname
% [3 g" Q# a5 E. i6 D! _; ?( {" E
#include <error.h>         //perror
# C; x1 D2 p# u  W; z#include <stdio.h>& l( L( |5 M& [
#include <errno.h>         //errno
, I9 t0 d* U0 @8 S$ L! S# z% d1 D2 j( {1 ^) p
#include <string.h>          // memset
8 u7 U+ ^6 y1 |( O8 I#include <string>
% v) y! R* r9 c6 u#include <iostream>
6 p" W, y% v9 c- d$ p
7 j0 P6 T- @5 _# B+ V  U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 18:08 , Processed in 0.061542 second(s), 20 queries .

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