cncml手绘网
标题: socket编程需要哪些头文件 [打印本页]
作者: admin 时间: 2020-5-8 23:01
标题: socket编程需要哪些头文件
[size=13.3333px]一 三种类型的套接字: }/ ]0 Z8 Y5 Q" \" H5 c
1.流式套接字(SOCKET_STREAM)
. i0 g7 v' Q+ W+ ^ 提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。7 x$ ]9 P6 Y' k
2.数据报式套接字(SOCKET_DGRAM): l5 A2 F% o6 T7 X1 T
提供无连接的数据传输服务,不保证可靠性。1 }4 Z, k+ H: l, I% Y0 S
3.原始式套接字(SOCKET_RAW)8 E: a) \6 }: g1 l2 Q& t; C
该接口允许对较低层次协议,如IP,ICMP直接访问。' k4 t2 [. l+ U
. A6 \/ F. K0 t6 g) g$ d
二 基本套接字系统调有有如下一些:( t `) u9 D7 x! D1 y+ r0 ~# v
创建套接字: socket(), l5 ~& z5 ^0 a6 G/ T
绑定本机端口: bind()& `- m4 m5 S& I7 z0 S" d
建立连接: connect(),accept()
8 P' Y7 R( `0 P 侦听端口: listen()
9 _, k; d- K) a! U 数据传输: send(), recv()
9 A+ F8 a" J! v! ? 输入/输出多路复用: select()
& P/ D/ h& g9 x2 W 关闭套接只: closesocket()
8 S2 F- [+ V3 v( c) T& Y
& w9 C t k( w+ K! z3 n三 数据类型
0 E0 c5 i; z2 m5 P8 F6 [" D8 Y! K struct sockaddr
. f: B( m& w% ]' H. i" {& Q z {
7 f0 \- l" ?# e7 a8 I$ Q1 l unsigned short sa_family; //地址族, 一般为AF_INET
' z2 R- [9 ?) A char sa_data[14]; //14字节的协议地址
/ t5 H4 j) Y1 {2 j {& T3 z }
; R, ~6 B/ a( r$ N' v. z k& l/ t- _/ R$ S) Q
struct sockaddr_in/ v) N. g% V& N2 f9 W, P5 h- ~4 e
{) v! [1 U% P! k9 [
short int sin_family; //地址族
$ T/ `' ~: z6 S" y0 t$ G: q unsigned short int sin_port; //端口号& g# N& d: h2 J* r/ R
struct in_addr in_addr; //ip地址
, @9 ~5 E% \. U/ ~9 r2 S9 | unsigned char sin_zero[8]; //填充" _0 F) O! ]# N& q( c
}& g }/ C, ^$ d, h. ^4 t4 F
% J/ D2 F# Z" z7 c9 @- u4 G8 F
四 常用函数& J* Y* T ^9 ^7 n; F
1 socket()
. r# d& o( n% _/ }' U 头文件: 2 z7 V$ r0 F* \% h8 k
#include <sys/types.h>
( Z# o1 s3 @6 \5 V* ` #include <sys/socket.h>. _ T1 k+ z0 }6 S8 I% h* G
函数原型:
( i( i' Y+ ^) T1 I x int socket(int domain, int type, int protocol)
6 j- E0 ^# r9 o, V' J6 C5 D domain: 协议类型,一般为AF_INET$ v4 A" F' `5 o
type: socket类型
4 k$ Q2 j, ^# i: Y0 L protocol:用来指定socket所使用的传输协议编号,通常设为0即可+ r) V, H# o( h' }% L' C* {. m9 i1 ]
% z6 R- W; [. X/ Z: z 2 bind()
1 l8 R- ?3 m: u$ R/ A# Q' p# | 头文件:' x: N, o; |* t+ C: G
#include <sys/types.h>( |% I; _& a- v2 A5 I
#include <sys/socket.h>
" {$ u, a& Z. u- I 函数原型:
* M# d) R! U" t0 Z: n+ j int bind(int sockfd, struct sockaddr *my_addr, int addrlen), _, U3 X( S+ p, e0 s4 T8 F y" B) E* p8 Y
sockfd: socket描述符
! B5 x, J4 s9 H; q my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
1 Z7 t$ K9 A. Y7 L, W- L0 ^ addrlen:常被设为sizeof(struct sockaddr): }1 }# q+ Y+ }
, y2 E' S0 D! `; `& Z4 U
3 connect(). }9 G# g# E7 o8 T9 X
头文件:+ M. V% X% A* `9 q) j% s% _4 S
#include <sys/types.h> ; m- D' M) g9 g) x1 a/ q. W3 N
#include <sys/socket.h>
5 Y, q3 H4 P" p" E- c7 \ 函数原型:
' |/ z& ~( M( l! f4 L. r int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
$ p& Y5 T: l9 Q; [ sockfd: 目的服务器的socket描述符. R% x' S) c6 W) L
serv_addr:包含目的机器ip地址和端口号的指针; h; [. j+ Z, b, v4 n n
addrlen:sizeof(struct sockaddr)) C5 ]$ u+ ]1 y7 N2 y# G G
: ^: O I5 i; r 4 listen()& y1 q& x2 S2 n4 U
头文件:( |; u. Z$ J) I* }- `9 \
#include <sys/socket.h>
$ u. J% Q d2 X& d 函数原型:
3 M+ X4 D) U4 c3 [4 _+ u int listen(int sockfd, int backlog);
7 k+ u4 [+ C j sockfd:socket()系统调用返回的socket描述符, `4 ^* S! s0 s" ?
backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
1 L, V& Q8 R6 U9 j$ Q. F; T
% p: d) n4 P2 G" j3 e 5 accept()
. W2 ?# a0 P7 k# [, _: N5 X 头文件:
. l/ `* @9 l# [& f7 C+ y0 C4 D' Z #include <sys/types.h>
7 o/ s% x8 a# Q+ Y1 L #inlcude <sys/socket.h>
5 I# @6 A6 i" @/ i U" l. v 函数原型:
) o* \. O- L! G int accept(int sockfd, void *addr, int addrlen)9 z! G: m$ I! W7 O
sockfd:是被监听的socket描述符9 }5 }! h! }. o7 O6 W3 J" t
addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
* ?% l2 ]1 o5 G addrlen:sizeof(struct sockaddr_in)8 q$ }) y2 x2 J) i, d8 }
+ H. y( N+ \- i. v- X& L# B4 B
6 send()6 ~- W) q+ z4 u% p6 G3 {4 }2 B
头文件:( l/ i! S5 g# Z4 P2 S8 w
#include <sys/socket.h>" N) Y8 w; M v, G
函数原型:
: ^ x& G6 @( q) z9 G3 R int send(int sockfd, const void *msg, int len, int flags);
$ I9 W/ H6 E8 I sockfd:用来传输数据的socket描述符
& G/ f3 \% }% n0 X msg:要发送数据的指针
& @* j/ P+ S8 h flags: 0
- `# N4 V) P1 _% ~1 y
" k, @: q, ]: s- @/ a4 m' |. X 7 recv()
' m6 {3 F5 b: I h' X9 N9 c7 y 头文件:2 P5 n/ \ w& L4 E2 b) A
#include <sys/types.h>
9 j& j& [5 \4 J# h( J #include <sys/socket.h>
& {4 M+ ]$ r! Q% C. B7 [ 函数原型:( ^) b7 V- a2 g/ z+ a9 r
int recv(int sockfd, void *buf, int len, unsigned int flags)
) z1 e# k8 o- [- t sockfd:接收数据的socket描述符# `' @. Z z7 v0 f4 y- ]+ W
buf:存放数据的缓冲区- R; A R- x* z- k
len:缓冲的长度( J' v5 ?! d' ^# D" J0 w( ?) ?
flags:0
+ j3 y$ u. q6 a, r1 h/ b. o9 A
- W5 R6 g8 F% `- ]1 f 8 sendto()
3 z, ]: U; O( d( H 头文件:
' V- N( ?; `; k9 ]1 Y9 ^5 c) } #include <sys/types.h>/ l8 Z# Z; ]- q1 a0 R9 S
#include <sys/socket.h>+ ~% I1 H; b5 c% \: m7 C; M8 f
函数原型:
3 a2 }" t W! ]! ]& v int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
& s+ O, c o O
) L: p3 g5 p0 Q& m5 ~5 ?/ g! d+ D9 x $ h. i+ N0 k+ R1 @
9 recvfrom()
- u1 N3 v: h8 P1 A2 d1 | 头文件:
+ f3 R3 |' k9 K3 ^: w7 N #include <sys/types.h>
/ T( m" K( \/ @$ z$ ` #include <sys/socket.h>$ r4 O" c, c+ B8 b9 ?+ i6 O
函数原型:
7 {; a& o+ K" l5 ~ int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)5 A9 Y$ u( [7 ^3 o# x
- X: L! y% I: G( @! I; _
5 b6 j) N- y3 M+ b9 O
10 read() write()' e3 ^$ ~/ o- v7 d
int read(int fd, char *buf, int len)
& n# d5 L* b. C L9 R, h8 J int write(int fd, char *buf, int len)2 @ A/ d7 l6 B* r
/ k& s% Y% Y2 V, n, |! q0 f; P 11 shutdown()7 x$ T3 S1 D$ W) A
close(sockfd)" I- Q0 C! q$ U5 }' p0 b
int shutdown(int sockfd, int how)9 m1 U( G" C; d$ i& z: A
-----------------------------------
[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等)
, U0 Y# W9 B! Y6 n4 Y" ^( K<sys/socket.h> //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等. t: Y& Q/ x, I$ m( X8 p
<sys/ioctl.h> //I/O控制操作相关的函数声明,如ioctl(): l4 t8 c$ A8 x) X \
<stdlib.h> //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等' E2 t" I9 v/ }- U0 S. O/ `
<netdb.h> //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等$ `! p+ V/ _9 l
<arpa/inet.h> //某些函数声明,如inet_ntop()、inet_ntoa()等5 K5 `% V" z$ ^5 c1 q: H, K
<netinet/in.h> //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
9 q9 j4 B6 X, e: G1 y0 l! O+ P# f; g$ B0 p! g9 I+ w' ]8 m
[size=13.3333px]#include <sys/socket.h> //connect,send,recv,setsockopt等7 C! P% B* ^, `1 a9 N
#include <sys/types.h> 4 i3 ]9 E9 n% E8 ]* i k; {6 _6 a, B
( e8 I+ V' p2 F5 w, Y" D
#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons$ e- P: T/ J$ _4 ^
#include <poll.h> //poll,pollfd1 X. E1 F! G6 v4 n* `
#include <arpa/inet.h> //inet_addr,inet_aton7 i- g9 ~( z; V1 b
#include <unistd.h> //read,write' ^0 {* _, I7 Z1 m% S* W
#include <netdb.h> //gethostbyname; v4 [8 S4 v) e3 w9 B" M8 B6 I
* h& \6 m) B5 f" q0 L% _1 W#include <error.h> //perror
6 g( H; I) @ L: P0 t#include <stdio.h>, Q# d! j3 L2 a
#include <errno.h> //errno- Y8 ^2 C% u Y) W) ]7 n
) ~, a6 p9 P1 c/ N: L" f5 h#include <string.h> // memset- N& s) ^! a( L, _7 e# v# I% {9 y
#include <string>: P2 U0 s1 A% R" _3 K2 w
#include <iostream>2 {- J0 J( j: o3 M
2 _& R$ ^6 j& K( P0 K% O
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |