cncml手绘网
标题: socket编程需要哪些头文件 [打印本页]
作者: admin 时间: 2020-5-8 23:01
标题: socket编程需要哪些头文件
[size=13.3333px]一 三种类型的套接字:0 _# M3 S3 j. S% T" K* C6 C
1.流式套接字(SOCKET_STREAM). ], H. [6 u s8 }4 j( Y
提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。$ W& r5 b q& Z9 z/ a- H4 H/ C2 v# u
2.数据报式套接字(SOCKET_DGRAM)
! E6 D- |9 `# F; i' ^' ~, ] 提供无连接的数据传输服务,不保证可靠性。& f" e8 S8 E3 q- O$ S
3.原始式套接字(SOCKET_RAW). P, h1 @$ R6 c/ c: S3 H" ?8 Q
该接口允许对较低层次协议,如IP,ICMP直接访问。2 w0 e+ t, ?- W# n5 j6 r7 o
2 ^% \* q4 |9 G) j4 A! m0 b" R& x! U8 b二 基本套接字系统调有有如下一些:! p& q7 D7 v' g
创建套接字: socket()! A3 K( o" y$ _1 m" f! L
绑定本机端口: bind(), R, P) q7 N: V/ W6 f
建立连接: connect(),accept()( T, x3 A+ a5 S, d3 [8 d
侦听端口: listen()
* X3 b9 \* _. s2 C 数据传输: send(), recv()- U. S) h+ h7 T7 {
输入/输出多路复用: select()% m6 s$ V9 x0 H2 d+ Z0 _
关闭套接只: closesocket()
, A& R" v- s0 @4 D
1 Z. O# _- a( Q' ~; U三 数据类型
' z1 t# v5 U& q. C E$ S) \ struct sockaddr
7 Q8 N( h9 d- `" ~& x; h: g8 }! E {
* g5 u# d1 v( k/ n/ T! J! ]) } unsigned short sa_family; //地址族, 一般为AF_INET
& [/ M" }: t3 }! t6 A( r char sa_data[14]; //14字节的协议地址
1 n4 k/ o4 A2 [: _/ b3 S8 t }" e7 v$ _6 w' E7 C/ w# ^
& T/ e# F' a5 h! \9 X
struct sockaddr_in' W) p5 j% n9 H/ Z6 u* P
{
' i& I! ~9 W! L' f short int sin_family; //地址族
. ]* p3 m8 C3 o unsigned short int sin_port; //端口号
7 ~7 @6 R. h' ~$ s struct in_addr in_addr; //ip地址
5 O# w& m' k4 F9 K& B: E unsigned char sin_zero[8]; //填充
7 x1 j; _5 B, B/ k! q } [4 M7 m5 L8 I: N4 X
7 r% c3 g7 W" @3 H$ \$ h四 常用函数
1 f/ J6 `0 M# _- U, a9 ? 1 socket()1 f% i: H6 m+ M; I0 G# w
头文件: & G' d$ }& d. q8 o6 \
#include <sys/types.h>2 y4 ^( O1 [% D; o& z7 x0 j
#include <sys/socket.h>
! x& n4 j0 e9 p/ d$ o; Q. G7 f5 x. I 函数原型:
9 s, B% }! Q+ L* ?8 C int socket(int domain, int type, int protocol)1 ^7 Z3 U: n# U0 A' r
domain: 协议类型,一般为AF_INET
4 h/ R. q! X: \4 P6 T6 ~' U type: socket类型7 Z% }) [) F) q1 r1 r
protocol:用来指定socket所使用的传输协议编号,通常设为0即可9 u+ I; K6 p, M3 `/ T
5 Z7 X3 i1 U& j$ N
2 bind()
1 x7 Y6 \ j& M1 W, j* d; o0 N. W 头文件:
: r" X, a/ b5 K #include <sys/types.h>+ Q# ?9 Y) [9 [+ r5 t# g3 \; b- f
#include <sys/socket.h>
4 V/ }1 a, E- m, y 函数原型:
% j2 x# B$ ]$ d" v/ K- k) O+ y int bind(int sockfd, struct sockaddr *my_addr, int addrlen) W% t4 t6 B R3 @5 B
sockfd: socket描述符% k/ ?8 @& G0 y& L0 n4 z% _
my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
3 g3 S2 B+ m/ y! ~7 m; d5 f6 X ]- } addrlen:常被设为sizeof(struct sockaddr)
/ ]; h! ]: i0 G+ K6 B) z' r4 t# Z
' G' J! f: v+ E4 u 3 connect()
. E4 y: u/ d! C; {/ Q6 v 头文件:4 D0 z# U7 u' E; G# H$ h) b
#include <sys/types.h>
1 R/ {+ u4 A! {, h$ h; _ #include <sys/socket.h>, y" s6 F% g% E- P2 s
函数原型:
* g( @, m8 C1 g! g- H! u int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
( e6 E6 {) ?7 s sockfd: 目的服务器的socket描述符
' y7 p: z5 l+ O9 n' b9 M serv_addr:包含目的机器ip地址和端口号的指针/ q' K5 f6 p- }& T3 \% C, l
addrlen:sizeof(struct sockaddr)
, H* ]1 F' P7 c
& _. k: r# r; x# k9 p4 V 4 listen()+ Z+ a/ ?6 b& I* l# y% L8 x% z
头文件:
- O( A: Q; A- W- q #include <sys/socket.h>
1 H9 \4 b. ^7 [# U5 G# g 函数原型:
6 h5 T$ r' |7 a3 V1 F int listen(int sockfd, int backlog);0 f1 P% t+ t3 T. }4 B
sockfd:socket()系统调用返回的socket描述符( \$ q. p8 l; D7 A) d" _1 X
backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。! v! X' H+ T* K
; [" O0 W( g$ N# E
5 accept()
2 @: ~& T; G9 y9 r% r& D4 ~( e 头文件:
+ R) i( l2 R' @- `5 [ #include <sys/types.h>
* f% E$ X# x) k+ u/ s# L #inlcude <sys/socket.h>6 p D# O% H4 v7 E
函数原型:
+ x& }5 a. P' v' ]. W; n* d* b int accept(int sockfd, void *addr, int addrlen)) h1 x$ D& p' i+ ]* y
sockfd:是被监听的socket描述符
) G- {1 g& I7 q6 K addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息+ {. e/ U% I2 i1 K- F: h
addrlen:sizeof(struct sockaddr_in)& H2 b8 h: h- f" ?! n4 Q
7 p+ a& r# U Z9 N2 j$ [% K
6 send()
9 u& E1 k: L' w' U 头文件:
9 {) v8 l+ g: N8 Q' o! ] #include <sys/socket.h>" G0 X- A z. A8 d
函数原型:
; I3 `2 v5 A. @* X int send(int sockfd, const void *msg, int len, int flags);
: M9 G& k' b( j% j, @* ?7 C* D sockfd:用来传输数据的socket描述符9 ^; |) S2 M5 I& l9 l5 P4 S
msg:要发送数据的指针
5 _6 m! i( f5 H8 E4 Q% m; F flags: 0
1 f o- v6 X) R* h
3 q# S' N s4 g% S/ X' I" L 7 recv()) p) V" f% A# C
头文件:3 \' z- j0 S) c. ^* Z6 l
#include <sys/types.h>
( s4 v4 t2 q/ m( T; t3 K5 \1 X2 ]& o #include <sys/socket.h>
: g! C3 s) f6 A! F 函数原型:3 F, p7 O' `, b
int recv(int sockfd, void *buf, int len, unsigned int flags)
- E" {! [9 e8 C1 D; s' n9 P sockfd:接收数据的socket描述符7 |) m& t% L; `; u
buf:存放数据的缓冲区' E2 d$ H: Q6 p( V
len:缓冲的长度
1 e' d1 b2 }' L, S8 r; _3 D flags:04 c( X2 T% |* I2 `( S, R
- u6 {/ y0 Q7 d, N4 p5 x) U, `
8 sendto()5 h7 Y% F6 H4 d' T
头文件:4 ^8 y7 [; ] _7 j
#include <sys/types.h>% \ H# l' ]: s4 r3 u; g
#include <sys/socket.h>
! V; N: d1 u# _4 @3 K" W 函数原型:9 j9 B4 t4 ?9 ^' ? b7 V
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
( q) d- p1 E; d/ Z" ]% P
: T. I _$ T7 u5 F) M3 I+ j
! x2 y1 T" q3 G4 A0 |& \- o 9 recvfrom()4 C) D* L, J+ F* u
头文件:
% x8 t8 Q4 `1 w9 t) Q+ |: Q/ p #include <sys/types.h>
% o0 a$ \2 ]* L& L k" o% h4 n/ D #include <sys/socket.h>( F' O1 ~; J' z( o/ y/ A* e
函数原型:
3 e3 l- R+ U0 J% H. o* m: D/ { int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
3 C2 w3 L7 t) i3 \' }
& o Z5 u5 z7 A2 x7 g
9 v% o0 X' U! f6 t# n 10 read() write()
# A' r+ D- ] w) M6 g int read(int fd, char *buf, int len)4 r) C- i0 }% J" ~- s
int write(int fd, char *buf, int len)4 t( _2 j( i5 U# J
6 B5 o, }7 u' j8 ^4 R+ \. ? 11 shutdown()
! _- G. ]8 h% Q' C# d1 B D9 L close(sockfd)& N5 K! \( I( v# |8 r
int shutdown(int sockfd, int how): _4 b& q# E3 ~* n8 n2 l( S: ]
-----------------------------------
[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 B+ Y" q' ~* a7 M5 k7 X<sys/socket.h> //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
. O# Z5 V) B* G g$ j9 D9 g' i<sys/ioctl.h> //I/O控制操作相关的函数声明,如ioctl()+ p4 d, a3 k$ n% X* V( ~5 U
<stdlib.h> //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
8 o- B' H) ?) i5 L<netdb.h> //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等' Y* Z1 Q; W) U3 v8 }
<arpa/inet.h> //某些函数声明,如inet_ntop()、inet_ntoa()等' `& M# v! {+ t5 m3 R
<netinet/in.h> //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
" r2 ?9 h, [! @+ [$ f# H. s& j w# i
[size=13.3333px]#include <sys/socket.h> //connect,send,recv,setsockopt等
; h6 ~3 m0 U, y, r+ v2 C#include <sys/types.h> 6 ^ e- }/ Q# `
9 d2 C" r/ h4 Y; a, `# k% u
#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons5 U' r% \1 r- Y T" }9 ?
#include <poll.h> //poll,pollfd
7 u) y- K+ f) ~, P2 H, M% B#include <arpa/inet.h> //inet_addr,inet_aton
& I3 y6 {) `( V#include <unistd.h> //read,write) n2 Z3 m B \) M- h
#include <netdb.h> //gethostbyname1 s/ s1 E* Z; Z; ~3 P- {
' a! V4 x6 J) R/ W. A
#include <error.h> //perror/ U: c% Q& B+ w
#include <stdio.h>
# O" {( B1 k1 T! ?/ _#include <errno.h> //errno
1 }. \( [' w" K [: |! i2 Q- F$ _/ d* b9 g8 c! M
#include <string.h> // memset
! c9 |. d( h, n' X# O# E" Q#include <string>2 b+ z8 R# w" q* v; K$ d
#include <iostream>2 D* S9 w9 S% [9 ~- A5 E# s1 ~
8 x/ @4 I; k0 y5 U. I' `
| 欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |