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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:2 q8 T( U' k. I; A
1.流式套接字(SOCKET_STREAM)
( K4 X# J2 m% F  e    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。0 ~2 v# d% a4 ?' S. l+ I
2.数据报式套接字(SOCKET_DGRAM)' p: `+ I9 J3 ^  ~, B& `( I
    提供无连接的数据传输服务,不保证可靠性。1 {2 H4 S, F3 }
3.原始式套接字(SOCKET_RAW)
5 t4 [7 V8 R3 k    该接口允许对较低层次协议,如IP,ICMP直接访问。
# z' j, Q6 O+ f" M" V# @1 o* q& m1 w5 [9 s; T. Z+ y
二 基本套接字系统调有有如下一些:" S+ Y5 Z( e$ s# j( M( r
    创建套接字: socket()
$ ?% Q. e, b9 R    绑定本机端口: bind(); F% ]3 Q8 E% H: q: l- ]6 E
    建立连接: connect(),accept()
+ |0 z4 B9 A: M# n/ K! ^    侦听端口: listen(). M9 ?0 T8 Y3 ?. k) y$ K
    数据传输: send(), recv()  f9 \& h% n% \: k, a
    输入/输出多路复用: select()
8 ~5 N9 d+ X  h9 |) v    关闭套接只:   closesocket()3 E8 j2 V, ?5 c3 {
   
# T* x0 D2 B+ u$ d3 W三 数据类型, I. \; Z1 U& \0 u- I, A
    struct sockaddr" r4 |9 T) F. w: P$ i: ~3 h
    {
/ z3 v5 G8 Z- V0 {. B" k       unsigned short  sa_family;   //地址族, 一般为AF_INET
$ O7 {8 E2 W, v1 k# @       char                  sa_data[14];   //14字节的协议地址
5 ?* F  i& _5 L    }
, Y' t2 `, Z( S  n, @' \
' ~  `9 K4 i0 z8 \. i    struct sockaddr_in
  z9 b$ B& M0 a. ^, N' y8 b    {
) ]- l! G1 n, P) R+ x       short int                     sin_family;   //地址族( h# \) Q& ~" ^* o- z: E
       unsigned short int      sin_port;      //端口号$ T( o. h$ V! O# K' X% `$ l" q' N  H9 V
       struct in_addr             in_addr;      //ip地址
; b& m. I; U3 d" b: S       unsigned char             sin_zero[8];  //填充
1 g3 _' w4 E( @: A6 v    }+ K* j2 n  Z. ?( U1 W/ b  L
+ k" u- b! z; w, U6 W9 U- b
四 常用函数. G* j1 S  h+ I" L0 p6 P8 W! Z7 W
    1 socket()
. j3 O! {8 c/ U& B) _       头文件: 2 y( T) ~+ w7 f0 f9 \6 f
       #include <sys/types.h>
( w$ A8 K5 C) a2 p7 z       #include <sys/socket.h>
( I: _4 _* H7 X7 c6 i4 [& l9 Q3 T       函数原型:
2 A. G8 k3 D7 T       int socket(int domain, int type, int protocol)7 H  g& }- P* {2 L
          domain: 协议类型,一般为AF_INET3 o' i7 v. R) L9 D+ w
          type: socket类型3 c+ ?' N9 a  a$ w
          protocol:用来指定socket所使用的传输协议编号,通常设为0即可
' q; @, c, T' {- {; s8 m) G
  z- i# {/ O8 Z" ^0 @7 u( F) e    2 bind()
9 {# V( s6 j' E% B3 x4 w3 @       头文件:1 A$ t4 _  n; `* U7 v" u& ^
       #include <sys/types.h>3 f- {2 e& m8 s8 ?2 r( L# B
       #include <sys/socket.h>: s/ K% ^; z5 s* J4 N) n
       函数原型:
$ [- d( l0 l- ^0 E6 q       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
/ ^' Z, w( w& S5 T          sockfd: socket描述符, `) T' G8 @- T$ H+ L/ h1 m* b
          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针; ?# ?+ z7 `* @1 U3 U: t* a
          addrlen:常被设为sizeof(struct sockaddr)
. p9 u3 J3 O6 p- U
/ U# V3 R) x0 p& t, H' g& |    3 connect()
# ?) F7 n0 b& I8 [( Q; h       头文件:& F9 k6 C" Z8 A! N* B) d. _! ]
       #include <sys/types.h>  5 K3 g  F5 j- O* u
       #include <sys/socket.h>
8 r' R  a2 n& F" S       函数原型:& J' T( M. i* d+ U# X
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)9 M. {9 M( p, P5 @: o
           sockfd: 目的服务器的socket描述符
  o0 |, l4 E  c           serv_addr:包含目的机器ip地址和端口号的指针8 m/ k+ J6 [: {
           addrlen:sizeof(struct sockaddr): m  ^9 L5 z; ]0 \- x

4 b6 ]6 ]/ A* ~  g4 u! v1 e    4 listen()
) P4 [# v/ N& o" E3 i       头文件:
6 _  [& b$ N8 K1 g5 N! A       #include <sys/socket.h>
' o7 V9 M$ t* J2 }       函数原型:
" |1 y+ R: [6 `7 r6 L       int listen(int sockfd, int backlog);$ Y' I0 }1 i$ n. @- R
           sockfd:socket()系统调用返回的socket描述符
4 v# ]' q# f0 x4 y; a/ Y           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。8 r: r* Q$ s9 J5 T

$ N# H( [1 a; O    5 accept()
" X5 R: J& f; \6 g7 X$ n       头文件:   7 h  P2 @& ~) k0 c- G) K7 f
       #include <sys/types.h>
% m7 s- m9 k9 v0 o5 B% ^, J       #inlcude <sys/socket.h>
8 r& Z& ?/ Q- V4 I' E! M       函数原型:
4 {  l0 X. W5 w. H) s+ x       int accept(int sockfd, void *addr, int addrlen)1 D- h' {/ G0 y7 x$ C3 |. A5 |
           sockfd:是被监听的socket描述符2 D# g3 H; Q7 G: n- f
           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息9 V6 c/ ~6 {  _, I! t! ~# F2 o( Q
           addrlen:sizeof(struct sockaddr_in)
7 ?6 E( X, g) I/ `9 q9 U       3 n' O% p  E3 `: W- Z
    6 send()0 X* Q+ T! u2 g& W
        头文件:5 t4 F! V9 O9 e, z/ D
        #include <sys/socket.h>
* ^  u- |0 {) I$ m5 C9 R& i; l        函数原型:$ M3 H# m, d  I" A' U! z- ^. A
        int send(int sockfd, const void *msg, int len, int flags);7 M; G3 h: y5 b: @' g& U
           sockfd:用来传输数据的socket描述符
% d- T4 O' q. s4 K& B" ^1 t           msg:要发送数据的指针
, c" y; n! @& q! H6 E           flags: 0
" j- w6 b! @  u      / y: c, i1 x. b0 }5 b7 h
    7 recv(). w2 F/ |; z% K+ p9 }
        头文件:8 K- L" h; I' ~; w$ i9 Q: {" ?
        #include <sys/types.h>- R6 c  n# q5 f0 G. V5 o6 R% q
        #include <sys/socket.h>
2 _3 s" R+ K0 z! z        函数原型:
0 L+ v7 e5 e+ o* I; W0 \        int recv(int sockfd, void *buf, int len, unsigned int flags)4 d8 b8 z3 R) \) c( n% D
          sockfd:接收数据的socket描述符% y) `; O. z+ J% ^9 M: G. G
          buf:存放数据的缓冲区
* {9 G# z. e$ l7 U, h% j1 q          len:缓冲的长度
9 `* f1 |+ F7 D- d          flags:0
' d; X; B- W( D, L4 M: ~& @5 d: e; \% G* G& Q8 |0 r
    8 sendto()9 y6 x2 N# J! q9 u7 `
       头文件:
+ ]$ h. C' A8 l. A" @0 `       #include <sys/types.h>  t# {( {3 B2 r* I
       #include <sys/socket.h>
( d& O" ^/ P( g0 H2 B) @% e: }. q       函数原型:
$ n: A4 Y% ^6 R. l       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);% a$ F; v8 d9 o
        
: U7 M8 E9 s% b/ E$ Z   
6 e$ P' l4 Y$ u$ w! T* k  f    9 recvfrom()
- P$ W0 |4 v1 y. W       头文件:3 e, B! j/ V" w: L, Q
       #include <sys/types.h>) B+ A  P& t3 [  k* ?
       #include <sys/socket.h>4 Z' A( n6 @& X# t8 V
       函数原型:
; I- J- f6 a( X9 O9 b       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)" Z& t) x0 r- Z: T1 q

2 ~* O8 t: c4 y3 t( ~8 B  ^   
) D4 y! c- T  z3 s    10 read() write()! w9 F/ x/ h# a
       int read(int fd, char *buf, int len)+ E  H7 G8 Y3 e" M' h+ T( s
       int write(int fd, char *buf, int len)- L& K. C6 K5 z) ?
       ( |0 W$ H* }0 s% W% Y
    11 shutdown()
5 C) }  }. [; s/ r! P# M' q3 L" \* y       close(sockfd)
% K! B  Z7 B- r) O* l- E" O       int shutdown(int sockfd, int how)  H4 P: z, @1 `" O+ R/ `
-----------------------------------
[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等)   
7 V, |1 I9 X* a8 o9 w# o- c<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
0 ?: W. G: O# J: M, l- J- {& ~, S<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()( _; W3 K0 L# K! K) ^7 k
<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
0 I" r0 D8 g6 L& c/ L<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等( L- b. l4 k% ?# |  @( l( ~
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等
1 x) M- z, u  J( I" w/ m& j% m* _5 Y<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件* T1 }5 R! P7 ~

2 A. q. m) O2 p) n# \5 L, ~2 J[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等9 n8 f. J) y$ e/ l2 n
#include <sys/types.h>      
: |4 r* D+ M0 I. _$ C) r
) o5 m+ e! O- A# t% a* i# o#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons- }2 O6 ~6 ]( A, J3 X8 I
#include <poll.h>             //poll,pollfd6 {1 a+ u  r! k7 v
#include <arpa/inet.h>   //inet_addr,inet_aton% X" w! N  j& I, [
#include <unistd.h>        //read,write
& o& |1 o  a1 J! w5 ]: I" W#include <netdb.h>         //gethostbyname) u, \$ \0 M0 y  C4 Y* I
/ D" H2 B' W5 E2 n% B
#include <error.h>         //perror
! W( S. _8 h) ^4 ^5 S#include <stdio.h>9 P& W4 O5 `  ^  o, P1 K; ]) S6 l
#include <errno.h>         //errno3 R* T3 G& p% J2 U; T2 I

. R% p! H! N, h( ~" J#include <string.h>          // memset4 H" b6 Y3 m+ p8 i: a
#include <string>* o& ?0 S' v8 v1 `
#include <iostream>
& v/ ~6 L4 v9 y, O. d2 s

: d( Z$ H; g$ R  U2 ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-25 09:36 , Processed in 0.136220 second(s), 21 queries .

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