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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:- j, e/ ^8 z: u! m& {( I( X
1.流式套接字(SOCKET_STREAM)% K7 C  J6 `7 T5 x/ V9 u8 P6 ]
    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。" t  o# z0 C$ q% ?. k/ O* `, {
2.数据报式套接字(SOCKET_DGRAM)
& Y4 ]+ ^" w; F- y& r  C& T    提供无连接的数据传输服务,不保证可靠性。
( a. C/ e; c5 K- n3.原始式套接字(SOCKET_RAW)# t  V' w% N1 x" a& X8 J
    该接口允许对较低层次协议,如IP,ICMP直接访问。/ j- [  \* V8 y1 r# K

/ D5 c& A+ C% v二 基本套接字系统调有有如下一些:
- x+ w: |5 i  `1 [7 l, @$ B    创建套接字: socket()# s8 [8 K* T  o" J
    绑定本机端口: bind()! A: @" p: _; s% H/ {2 n& {
    建立连接: connect(),accept()  }9 b* M( V0 F5 C, @
    侦听端口: listen()
$ u' G! n  k# C) ^2 i1 p4 m  ?    数据传输: send(), recv(); y6 @+ B+ A1 \- i
    输入/输出多路复用: select()
4 _2 p# T! ^" @, q1 _    关闭套接只:   closesocket()
/ J6 e. Y- h) t) F0 {$ i   
. x4 q7 M+ R- i6 c, h三 数据类型. _& L6 g) t3 R8 G8 k
    struct sockaddr- v* u# Z2 o0 C5 s9 C+ y
    {
. s% `! b$ b# J$ h. C: t       unsigned short  sa_family;   //地址族, 一般为AF_INET/ i+ K' P- ^+ B9 d
       char                  sa_data[14];   //14字节的协议地址3 V4 l7 H7 b0 @* ?2 z/ {& r( @
    }
: u; Q# C2 i- \$ T5 m0 p! b
- t6 T3 D/ g+ ~; J7 X    struct sockaddr_in
' \5 a/ J6 V! L" i: E: Q6 V1 t    {7 ~* n# |2 R; q2 L- J: R6 p
       short int                     sin_family;   //地址族3 f2 J/ O% @( _% L- G- L
       unsigned short int      sin_port;      //端口号
1 P+ K- Q9 a% r! i  E; D       struct in_addr             in_addr;      //ip地址/ z4 K7 p1 R2 i" @7 e
       unsigned char             sin_zero[8];  //填充# A1 l1 C2 [( p2 @. f
    }, d! ]9 a) p5 M' O" R

, u: V, Q  x' C6 O7 `* U四 常用函数
( y# Y0 ^, u) G+ l* j1 y9 ^( U    1 socket()
3 l- U5 S: z. y       头文件:
& d7 `$ V  f3 b: O# f. h) V       #include <sys/types.h>
. E8 M# a) x5 u6 C9 [       #include <sys/socket.h>
- i% P5 p+ S6 L8 {- a0 }- K       函数原型:/ _# M7 z  g6 Y* r0 O: q
       int socket(int domain, int type, int protocol), {/ J- P$ p/ Q( V3 I# k: k
          domain: 协议类型,一般为AF_INET
! c  \5 w5 ~5 B: ]- p0 |" |1 ^          type: socket类型( w  p/ `$ ?  y& k
          protocol:用来指定socket所使用的传输协议编号,通常设为0即可
/ h1 {- r/ s; P) ~: }. W8 Z
5 _5 y/ q9 d' S  s2 p" R    2 bind()
1 k0 u' f# N5 i* {       头文件:  u: l) J0 k" |0 Q
       #include <sys/types.h>3 k: |: O; o2 M; G2 ?( V2 o
       #include <sys/socket.h>- T# T8 H3 ]' V
       函数原型:
8 P% C/ e) W. H+ v5 F1 d1 O       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
, n' e4 S# {3 [4 k6 N; c1 ?7 ^$ [          sockfd: socket描述符
3 E8 I/ p# c0 e( L' P" ^4 f          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针0 [8 f& _+ m1 L! l
          addrlen:常被设为sizeof(struct sockaddr)
4 @! z1 z% W0 Z2 A7 u3 U1 q9 m9 z. l9 z6 `" b1 C
    3 connect()
: Q+ m/ S5 H: P5 a4 [       头文件:
8 D8 f9 t; i. i7 J: ^. M1 K  m9 Q       #include <sys/types.h>    b& {1 G- l( E8 _
       #include <sys/socket.h>; k! C8 C: `" g# Y2 M
       函数原型:" Y. q2 G& \, _9 z( p% E1 b
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
: M+ K" O! k, e( f; j0 B" z2 b2 I8 u           sockfd: 目的服务器的socket描述符2 n$ F' W/ m) D% E  b
           serv_addr:包含目的机器ip地址和端口号的指针
% K2 V1 E! k- h. W           addrlen:sizeof(struct sockaddr)
5 F: E" f9 u/ z8 C: y9 t6 ?; B( J+ }  V9 W
    4 listen()
3 ^" U; h1 t( V  F( S. M/ R       头文件:% X; o7 K: S1 ~8 {
       #include <sys/socket.h>& z$ p! `5 [- K3 P1 ^1 i- n% p! o9 F
       函数原型:
0 X8 V  E% S9 M5 x1 h2 R0 F+ V       int listen(int sockfd, int backlog);* u0 ^1 t, f0 P! H6 x- A
           sockfd:socket()系统调用返回的socket描述符6 E4 q' h# ]  W1 T
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
8 [& A$ ?" \( y: y* q& l! X
4 ~1 V' _$ @6 v, q, p4 ~3 x& N# l    5 accept()
3 ]- u9 I7 Q7 C       头文件:   
7 _2 L1 C, n& F$ k+ S5 @% \$ ]       #include <sys/types.h>' l/ \. \0 ]- g: m
       #inlcude <sys/socket.h>
3 T4 F4 x9 `' ^0 O  s5 e       函数原型:
/ o* N- G, R0 E. {9 T0 c       int accept(int sockfd, void *addr, int addrlen)/ L5 \) Z" m2 ]# }0 k
           sockfd:是被监听的socket描述符
* e3 q. ]: B4 |# Y4 W! v           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息; H" E; F! c; `
           addrlen:sizeof(struct sockaddr_in)! T9 ~) N* p, |! c1 [- I2 `" z
      
6 B, V. ]3 q8 A$ w# M1 h    6 send()0 M- u. F2 j( ~% x+ V
        头文件:
' l  O2 z* z! V" }1 l8 Q/ E        #include <sys/socket.h># h: V% v1 n+ X1 \8 `
        函数原型:
/ k" n# I- v* q0 D  i9 _; v$ t        int send(int sockfd, const void *msg, int len, int flags);
  ^: V* }0 Z! U! C& p! y# q3 Q           sockfd:用来传输数据的socket描述符
( P. |+ _+ y2 c. }# q; H           msg:要发送数据的指针
& q* o6 u' O9 X           flags: 00 C. C9 d7 e( |! U+ r$ s/ F
      
/ K. ^% q% ?' \" e    7 recv()
6 D+ q* ~1 d& S7 |0 R8 O- T2 C8 v0 P        头文件:
" x3 A( q" T- q* O; \6 U( Z        #include <sys/types.h>
( D2 b, M4 a5 c6 K        #include <sys/socket.h>
% R) S% X" F, s; e$ f7 e        函数原型:
% l% Y/ q/ E4 F% t$ m. E' S        int recv(int sockfd, void *buf, int len, unsigned int flags)
$ N1 ^: |! _# \( z  I8 `          sockfd:接收数据的socket描述符
& v3 {: f9 j/ ^# h% k          buf:存放数据的缓冲区4 A0 P. W. p  }
          len:缓冲的长度
! x2 R5 c2 a- T+ V: Q9 l  F2 H' k          flags:0
( E6 ?, ~0 U* k/ K, }3 \2 q: W: w, G  R" _  B5 q) n7 h- ~- W9 ]
    8 sendto()
! v" ?+ m' }2 \( C& J; d       头文件:! N. X* w  y! C) x( f8 N: i
       #include <sys/types.h>+ g( x0 ?8 q/ q" Z- j! o: h* I! X
       #include <sys/socket.h>* s+ `8 b9 T% ]+ N# E  J8 N# F6 i
       函数原型:
( i% k7 j3 @' p9 V  c       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);  i+ V$ Q# B- l. ], k% v) i
        
. d6 c7 H  ?2 g. v   
. e. b9 D. y# N3 N3 l6 d    9 recvfrom(). h: Y, s: c0 U  r# R3 ~5 B/ M
       头文件:( h) v$ Q& i& B) v$ w  K8 ~4 o
       #include <sys/types.h>
! b7 z5 ]- I- a& {# S7 ^7 A2 z7 c       #include <sys/socket.h>$ A; p9 G" g' Z0 [. F
       函数原型:
5 D- E* ~* Y: r" H' l5 ^7 E! {' V       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)' o% F4 \% O( E) c- |2 j
  x. r4 M: U& Q; \) \1 y: \
    / t* ]' @0 u8 H9 ?- v6 m: k8 w
    10 read() write()6 O" Q: x# |/ W9 j% J
       int read(int fd, char *buf, int len)
- I  q/ A6 i7 V6 d       int write(int fd, char *buf, int len)
: s4 E1 Z' x* z; C# |       3 Z2 P2 i/ O% e, t  C1 P
    11 shutdown()
4 E" ?0 z( H# q& f       close(sockfd); ^4 x+ J2 |3 ^4 K& e3 ~' w
       int shutdown(int sockfd, int how). e! P) z; m- s% o, |* \/ Z
-----------------------------------
[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等)   0 w; y# X1 W4 L( S2 s" Y9 E/ z
<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
' H: r" U, [' q) Z7 W& Q5 w<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()0 Q: E3 ?! i- d" D9 q1 D
<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等. l1 }1 m8 ?' L* Q; b! I. W8 ^! u! \
<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等
, C  A" p, s6 ?. l<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等) `5 ^2 b8 K5 X  w: Y# c
<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
. r0 U2 J' Y; {& o% [0 e6 Z
4 X& x& {6 k$ {" u- O; n* p[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等+ ]! H* t  e5 A1 R# J: s) O
#include <sys/types.h>      / W& |% R3 w) r" n, }4 z, r
! Y2 S8 n, [# L# Z2 Q4 \
#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons) P! I, J* P3 g
#include <poll.h>             //poll,pollfd) A" G: G! H, L' _
#include <arpa/inet.h>   //inet_addr,inet_aton3 a6 q; \. J7 N4 F# y$ F1 S
#include <unistd.h>        //read,write% ]; r, J& t7 n. F: S) _; P) W
#include <netdb.h>         //gethostbyname* h. o; j; D9 j7 K! A: ]

# E1 Z5 h# X' b4 e, h#include <error.h>         //perror% p+ I: g1 p. D  ^9 P
#include <stdio.h>
/ }7 n! |+ J8 E8 g#include <errno.h>         //errno
+ D) b) s$ l) U: F- ?, T; q2 h7 M5 B& w/ {  ~) o
#include <string.h>          // memset2 ]) z7 Q9 B* O2 W$ O& q& T. U
#include <string>2 p1 J4 C$ b2 o( u
#include <iostream>

7 P/ E: b$ `  `- B( e
' t- y8 D$ [# S- l9 n9 Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-17 11:13 , Processed in 0.124059 second(s), 19 queries .

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