cncml手绘网

标题: socket编程需要哪些头文件 [打印本页]

作者: admin    时间: 2020-5-8 23:01
标题: socket编程需要哪些头文件
[size=13.3333px]一 三种类型的套接字:1 p9 a0 {2 G9 _) E* r
1.流式套接字(SOCKET_STREAM)# |! Z# t2 v  ?; ^& v+ q
    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。" E# ^7 x4 |- X, p. T  J
2.数据报式套接字(SOCKET_DGRAM)
+ j& ~  T7 o+ p4 N: M- @) W' ?3 m    提供无连接的数据传输服务,不保证可靠性。3 p+ Z# g9 k7 j& g
3.原始式套接字(SOCKET_RAW)
0 d1 c/ [( @% a5 \& y2 D    该接口允许对较低层次协议,如IP,ICMP直接访问。
0 E/ U9 J2 f+ J, A+ N7 y+ ?1 k9 e' Y+ G* w6 f7 e
二 基本套接字系统调有有如下一些:
: `" ~  `7 Q2 N8 r+ p    创建套接字: socket()( ?- Z# s% T' D* q$ Z- c
    绑定本机端口: bind()4 m; ]- c0 j/ v' W0 K
    建立连接: connect(),accept()) G' m; n# {* T. s  i
    侦听端口: listen(): c" o' r9 u: p, Q, y
    数据传输: send(), recv()
, g' g7 s& @' e1 X9 r    输入/输出多路复用: select(); p4 C, X/ Q' c! g
    关闭套接只:   closesocket()
1 s# i3 N! B- s' C% K   
( f4 y+ X" t) H" }+ |6 C& ^1 E1 n& \三 数据类型
9 O$ t! T7 B3 h- k$ K$ A4 x    struct sockaddr
; }5 f% C, m; D. Y    {" U/ i3 m$ M3 `9 b2 g1 j
       unsigned short  sa_family;   //地址族, 一般为AF_INET. |  m8 |" r  l8 f; {
       char                  sa_data[14];   //14字节的协议地址
) Y: Y% k! G9 J  `0 D: G    }+ y$ T5 U* e0 B" S( s) M, ?

: i7 \1 l, n1 y# _8 R* R9 l    struct sockaddr_in
. O# Y4 C" [7 B' e5 K0 ~$ H# W& U$ C    {
" S0 C: X5 T5 ^! u* P3 }       short int                     sin_family;   //地址族8 ?. I* i1 {  p# ?. F! p0 i3 Q) N+ Z" f
       unsigned short int      sin_port;      //端口号
5 d$ V# v9 X0 r2 p1 T0 l       struct in_addr             in_addr;      //ip地址( M! H4 e; H& [- ]) q* [
       unsigned char             sin_zero[8];  //填充
" m5 a/ Y8 b6 O    }
& T2 l1 \  f# ^, W" X% w1 }! s
( C9 I* S& I' D& x& r3 A( W/ \1 o四 常用函数% ]$ l0 x8 w" P: F, p- D
    1 socket()
+ w/ F0 i. }: H2 `7 Y$ R, s       头文件:
( e: F1 b) Z! A- d7 C% Z. Q% r* [       #include <sys/types.h>
  e6 ]8 [5 X* j" a1 q0 U9 i! v" F2 \; A       #include <sys/socket.h>4 k/ O  v  ^0 A. N9 E' }
       函数原型:
8 S: Z8 _- [7 o1 ]+ D5 X       int socket(int domain, int type, int protocol)
2 ^, I7 J+ i, z/ ]* ^8 S0 B! [          domain: 协议类型,一般为AF_INET& u" [9 \3 J! z& F
          type: socket类型- L1 R6 p: y* y/ b
          protocol:用来指定socket所使用的传输协议编号,通常设为0即可: E! S- [; C, T. U% }
( G4 M5 m6 x+ Y5 l
    2 bind()
1 d+ i2 d$ ?! r# h" H       头文件:9 u! F+ @6 f1 J  M: \# a
       #include <sys/types.h>8 i' Y3 F+ R0 c' D( E# p  A
       #include <sys/socket.h>  F# d8 {4 N: d& E
       函数原型:
, l+ ^- X% [1 X$ w5 S5 R# w* J       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
4 D. D2 l, ~3 |: x- O5 d$ m7 D          sockfd: socket描述符+ m+ d, B* V* u: Q" v
          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
3 v& }4 ?2 m  B6 z' q* H5 h% J          addrlen:常被设为sizeof(struct sockaddr)3 a; r; @. z5 l1 b9 [& q

8 r0 u4 C" V3 N    3 connect()
. o4 s. T  i2 h: T% j6 C5 j       头文件:3 k+ @% ]0 B2 i8 e
       #include <sys/types.h>  
: c- w7 u5 l) _       #include <sys/socket.h>1 b/ ~, R$ X0 ?8 ?
       函数原型:! J8 [4 C( u7 O5 w. r$ _
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)4 t( Q( @. c; U: ^  U; [
           sockfd: 目的服务器的socket描述符
+ F7 u4 T% x5 t* R1 Z  Q* m$ K# L           serv_addr:包含目的机器ip地址和端口号的指针" L' Y" I& U! W) r, l) q
           addrlen:sizeof(struct sockaddr)* X. K) ?. d; n
6 i3 V" N- G! U5 [. d
    4 listen()
, r- x- \2 S7 R$ a9 ?       头文件:
/ U/ U) A0 L5 w' ~2 ~( |' ~       #include <sys/socket.h>
* I3 p' b% K6 k, y  |5 q       函数原型:
/ q, l  j6 B+ u6 K+ s5 |       int listen(int sockfd, int backlog);
' t' k0 T4 z8 j           sockfd:socket()系统调用返回的socket描述符# A/ V' C1 z/ }3 M1 ?& t
           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
8 b6 M3 ~! m8 L" K5 L' v& u
# v$ ?; \7 `$ j3 {3 G    5 accept()
, B8 J3 j2 E- @       头文件:   
3 ~- O" z& u( U  ^% V  H5 Y       #include <sys/types.h># e$ u) ]. N& T. E3 ^  x
       #inlcude <sys/socket.h>% @7 @& q& z0 A
       函数原型:
  B8 x( @' ^' F. y5 C       int accept(int sockfd, void *addr, int addrlen)
+ y2 e; L' P% V, z  n* E* w4 W           sockfd:是被监听的socket描述符
1 b! R- P5 M& N5 @' w           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
0 ]; c2 |+ C/ Q1 _4 |           addrlen:sizeof(struct sockaddr_in)
* O0 F8 ^" _( L$ W3 O% R. ?      
/ H0 @6 F5 L* o" `0 j. P) F    6 send()
2 A" }+ Y1 ?- ?8 r+ _- A9 W0 Z$ @        头文件:
5 ]# d8 k& _3 e* F- n        #include <sys/socket.h>7 C' H; w& O' x5 J  `
        函数原型:
( Q0 |- S5 [8 V; ]/ R        int send(int sockfd, const void *msg, int len, int flags);
. u8 B' B% _. H, i8 w           sockfd:用来传输数据的socket描述符, F4 ]6 I( O/ u
           msg:要发送数据的指针   [1 y! J& S! D& p7 w6 t# z
           flags: 0
5 X' \# x. O7 A9 ?8 F0 x      $ Q1 l3 M( H# B. f# Y+ D
    7 recv()' q$ e7 C* {' o
        头文件:& E1 h0 S# [- N4 Q
        #include <sys/types.h>% d5 P+ y3 ~5 B9 }' y3 r  @
        #include <sys/socket.h>; O+ H* A( I: a, v  r
        函数原型:- P$ s/ u* }" z/ @
        int recv(int sockfd, void *buf, int len, unsigned int flags)" `3 v9 x1 A& a: l' }
          sockfd:接收数据的socket描述符
9 N! ]; k: i# P6 ~* x$ g# |8 h          buf:存放数据的缓冲区; S* h' c. F' q: y
          len:缓冲的长度' {- F0 k) s& |" B/ c
          flags:0
. {* L6 o! b/ e4 s5 Z3 |0 [. {1 i6 p- U3 D7 u; w9 q" s1 |% g
    8 sendto()7 a+ T1 `4 Y' j- g
       头文件:
. z4 Y) z" e2 g4 o+ W* u       #include <sys/types.h>0 s( {% A. H/ ~" B) u
       #include <sys/socket.h>
( U( d$ Y  n: D$ w( [+ a; U3 m' `3 p       函数原型:4 @2 p- T, t2 O+ ?" N' q
       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
- x5 K. V6 J' T; C) \" n) \        ! Y) Y  I& W% }# B" K
   
/ Z  b5 q8 H5 H" {' b5 q    9 recvfrom()8 N1 T( j, T/ R
       头文件:- K% ]+ i2 L% k- n9 ?
       #include <sys/types.h>
3 X& x$ X" j0 O9 B  s% j$ M       #include <sys/socket.h>' y8 m8 ?6 ~. m
       函数原型:" C2 t/ b; K. j# z3 t4 O
       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
9 @6 {/ J$ I+ ^% T
  E- d1 W0 x- s1 b. \    5 w0 u* K+ a( \! r: Y; N+ Z: o
    10 read() write()
/ x9 q. r  I# g0 u- p       int read(int fd, char *buf, int len)
/ S4 n/ S% `/ R- q7 k2 P4 Q$ o       int write(int fd, char *buf, int len)/ O" e- o. v+ r6 z2 a  b$ i
       / _) P, d$ A8 G1 O
    11 shutdown()+ D4 H5 i) J8 t! F# U
       close(sockfd)
! G+ Q4 Q* ~+ n% d7 s       int shutdown(int sockfd, int how)  i  Z4 W4 H, B" N$ p8 ]
-----------------------------------
[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等)   
* K2 n7 i! g: V- c<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等6 ]- s# J! J( f, y
<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()
& t+ x' y0 g$ v  p<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
8 L5 e/ p1 U# g6 t& f; n<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等0 Y/ ]2 h- ~& ^/ }0 W% s3 A/ N
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等
& F3 A3 c/ C$ x: |5 ^<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
2 @) x3 D1 a: m6 p; Q0 R, [4 {4 C& p) X* b4 U( F
[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等
7 J9 P$ ]' @) K9 E#include <sys/types.h>      
3 G+ H. N: q; b
. h) i* c' b% m( O& K#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons4 H# o  p4 x4 I% f( g. O
#include <poll.h>             //poll,pollfd
1 k% s- g  Z* P7 o( P; k#include <arpa/inet.h>   //inet_addr,inet_aton
9 v) B  K3 c8 o+ s2 M+ F#include <unistd.h>        //read,write3 q# ?( l* r! C* b/ M  s
#include <netdb.h>         //gethostbyname) G+ B7 c* N! G; B6 P1 @: x
3 o, ~7 X: N% |4 R2 U2 U
#include <error.h>         //perror
  g' o  E6 ]- l. U0 J#include <stdio.h>" D' Q8 \: g1 F" R
#include <errno.h>         //errno
2 K1 E9 ]4 B* ~" K+ T9 a  o7 m, S3 ]6 u$ Z$ N
#include <string.h>          // memset4 P8 Z# V1 i  w: K) M+ G
#include <string>/ A/ O. m5 O' A' n1 |' X( a" g: B4 L
#include <iostream>
! l% l( L: c" G" ]8 K% f5 k' {
2 v7 N& j: G% {6 N  L





欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2