cncml手绘网
标题: socket编程需要哪些头文件 [打印本页]
作者: admin 时间: 2020-5-8 23:01
标题: socket编程需要哪些头文件
[size=13.3333px]一 三种类型的套接字:9 ?; a+ K$ i- s: O/ k6 ^( d
1.流式套接字(SOCKET_STREAM)
( R ]6 V2 u6 z* a6 S" Z6 N 提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。/ C/ } J2 w0 C4 @; L3 Q
2.数据报式套接字(SOCKET_DGRAM)
( X; j3 ~( Y% \, X 提供无连接的数据传输服务,不保证可靠性。
/ [) C0 A/ e; @: A3.原始式套接字(SOCKET_RAW)- K+ d1 D Z- H* {
该接口允许对较低层次协议,如IP,ICMP直接访问。
2 L7 i0 M: p @% [8 @( X! l! F- c7 Y
) _, S9 e2 i2 @二 基本套接字系统调有有如下一些:
. y2 R4 A& R9 ?9 | e( F 创建套接字: socket()
8 I- e2 w0 t% t/ z 绑定本机端口: bind()" f9 a0 F0 u t2 z, q
建立连接: connect(),accept()
# a7 q. N4 p# D0 S% b% ` 侦听端口: listen()" l1 u- p: S& h( ^! t
数据传输: send(), recv()
7 P2 \# z' P1 w& ]9 U 输入/输出多路复用: select()
f' l8 i2 r5 t# t& x 关闭套接只: closesocket()# z! `; H e- i/ `4 R
3 l$ h; Y: o0 C& S1 E1 F
三 数据类型
$ d. u# W" W# b( W D) H3 l! ] struct sockaddr* ]' I' p- s: z, z, ~: u
{
/ c7 R i4 J7 ?2 Y) h unsigned short sa_family; //地址族, 一般为AF_INET
* Q* r1 x4 Z* q: u: M char sa_data[14]; //14字节的协议地址
3 I' H- Y0 H. G2 w* O$ ~ }
! G0 @- m( S7 } A9 _4 K# X" Q0 Z: ]" I" ?
struct sockaddr_in" F% e4 Z2 W `# g8 D9 T
{) ?; c- X; I# e1 `. c j$ ^
short int sin_family; //地址族
/ A! i h. g1 B6 S unsigned short int sin_port; //端口号
8 j( [3 b S1 C) X struct in_addr in_addr; //ip地址* i- B) q' d& L* C
unsigned char sin_zero[8]; //填充9 R. t. M. o$ ^ I% V9 {' c8 e, E: t
}" N% a2 B4 s# C5 g2 N
, e; \: W$ r& W+ W- D3 ^四 常用函数$ y+ r! H# A( n$ @0 w, n
1 socket()6 \& {& R) l8 y6 l; F5 d
头文件:
4 s# k7 T$ x2 |+ g& W, w$ F" `( S #include <sys/types.h>4 ]8 S1 W6 }. V8 u6 V A
#include <sys/socket.h>
# K+ X# i& f u' t7 _2 y 函数原型:( |& X8 C! L; t& G* D! _
int socket(int domain, int type, int protocol)
: Z. ~% B2 ^2 z1 H" v domain: 协议类型,一般为AF_INET
6 x: |7 x# E+ W( f type: socket类型
r2 O; U* l. u protocol:用来指定socket所使用的传输协议编号,通常设为0即可- x5 V" r1 u7 G6 h; a" f; ]! D
S. K2 Y0 R- y4 z/ \" f- B% F
2 bind()7 \# l% D+ K0 f2 f$ q0 S2 P
头文件:( W! t1 I4 L3 r5 [2 ^2 k" v4 V7 B" I
#include <sys/types.h>; M2 e( Z; R& n* ]
#include <sys/socket.h>0 E& O& e# d; m; i/ p# h
函数原型:. b# D- a$ ]9 x9 i# N3 }4 I$ I
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)% W& h7 \" f' H& v1 B a: |+ e0 d
sockfd: socket描述符
7 E3 x. H) h/ H" |. w! q: q& s my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
0 V+ _/ H( V6 y K" | addrlen:常被设为sizeof(struct sockaddr)
4 |) L- [' k6 P1 q% F1 R3 ~ a7 W9 ^2 t/ [$ S
3 connect()
9 d0 n/ D) p1 X% | 头文件:; w1 T! T; r9 c7 x
#include <sys/types.h>
6 `- D$ g( o% V6 C$ [4 E #include <sys/socket.h>
0 m) |" u* Y4 K% W9 x 函数原型:6 N6 j, ^+ p2 E" R9 [
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)6 N3 `4 s k& E& X. J+ x( F) q! ]
sockfd: 目的服务器的socket描述符
+ Z9 ]$ J7 m7 M& V H serv_addr:包含目的机器ip地址和端口号的指针
8 I! z" u9 k3 ^7 _ addrlen:sizeof(struct sockaddr)
; E4 [/ H" p; m
2 n% g& l- r' T7 T* n 4 listen()0 i3 B M8 J9 P
头文件:2 d( c& B, `5 H, T- C7 w, t. K
#include <sys/socket.h>
+ l9 S. U8 z1 a) P# g 函数原型:5 ?- Y8 {8 ?" D' c
int listen(int sockfd, int backlog);4 r7 w+ ~. y. Y; j3 J- x
sockfd:socket()系统调用返回的socket描述符
+ b: @; o+ c! D0 t0 Z& Y backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
6 W& ]1 M: K; r. o" j' s
9 V ?$ ]9 n, @ 5 accept(), n! c0 M. q( U4 i5 q" X; |
头文件:
6 k; X8 a) z% _) X$ C7 ^9 n #include <sys/types.h>' B- N$ r( n2 l4 W: r1 I- e7 B
#inlcude <sys/socket.h>
& K/ F/ P5 Z0 ^+ J' L 函数原型:
; z9 D# H* u7 |1 D int accept(int sockfd, void *addr, int addrlen)
* P2 j) U6 k1 T, k6 r: p& L% {; M& K* R sockfd:是被监听的socket描述符
) o2 D& T7 o/ X$ X6 j# \& Q& E addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
3 x5 [) T, b# s% g addrlen:sizeof(struct sockaddr_in)3 c8 h7 ]; A' }: y6 v* ] q; {
0 B( q# [1 U8 I7 _, q! }
6 send(); |9 W# O" L$ h1 N1 x `% S* z' M% K
头文件:
! _" K4 O: u1 D" [# e3 B$ A #include <sys/socket.h>
% N5 X; f) Y% ]6 [* i' X7 K 函数原型:' S2 h! L4 K2 E% L$ Z% d
int send(int sockfd, const void *msg, int len, int flags);
0 g0 I% l# A7 j$ s& d( D sockfd:用来传输数据的socket描述符
/ f: n, X3 y3 {/ e) n: S* u msg:要发送数据的指针
% I; G- x9 W, ?+ ~- w3 w, h( ~ flags: 0. B! Z) r( N! v: I" ]2 ^- @( ?
8 ^4 I& k' {, X. h
7 recv()0 k4 s8 j' \( B
头文件:1 w' Y9 D0 J2 q& J# I
#include <sys/types.h>
+ c. P" O) R) h- N #include <sys/socket.h>
9 o9 ]( y5 w8 ~9 k 函数原型:
' ?9 C1 Y' y) X) C C8 f int recv(int sockfd, void *buf, int len, unsigned int flags)4 [. K% {2 i: b
sockfd:接收数据的socket描述符
7 y, p# F2 E- i( ]' a buf:存放数据的缓冲区/ R, ^& p: [5 ^9 A! C; Y' m
len:缓冲的长度5 y! }% x! C( H9 W( s- ?5 F8 \$ U
flags:0% n+ c& Y9 D- e
- _. ?: e5 V% C% M3 ^! ^
8 sendto()% i6 C' M& T) F: L
头文件:/ c9 Y. p8 q8 i) X
#include <sys/types.h>
7 ?; M. a: }1 X! n8 p #include <sys/socket.h>6 ] d: k7 s, X( m) U
函数原型:
8 q" x* b8 l* k v% Q1 s }, r' P int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);" f5 {% f# h9 F1 P3 J
; g: l* D+ _# x' }1 W
) O. L$ s6 z- z' q 9 recvfrom()
* Q" J( b* W. E5 u& g 头文件:5 e, g& u8 d9 B. ^" q
#include <sys/types.h>
0 T( b. K) ]8 n+ ] #include <sys/socket.h>! a; Y# E5 T$ u1 ^- S: O0 W9 z
函数原型:" C1 y, b% o* e1 g4 W( A5 t
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
/ R; D6 ~2 L/ i; h) B4 o
# Z! i4 Y' o# y l0 R8 @ ) ]& ?$ U9 _2 J+ M* h5 j2 E
10 read() write()
7 @* A# j' s* r5 T# N4 j int read(int fd, char *buf, int len)
& R. @2 e" N: @; T' |, `; g int write(int fd, char *buf, int len)% q' [0 t0 _9 t& Y
: z& p, u5 p4 R7 ` 11 shutdown()* C- A$ N3 f t* p. C( T, X5 J3 i
close(sockfd)
8 P# m6 v$ z8 K6 r& \8 _ h- ~ int shutdown(int sockfd, int how)% f ]7 C+ X6 ]3 b
-----------------------------------
[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等)
' O7 V. |' u! j" d' v' n# t, F6 }<sys/socket.h> //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
8 Y/ \7 V- Z4 C<sys/ioctl.h> //I/O控制操作相关的函数声明,如ioctl()
$ d, l/ O1 y2 x r' ~<stdlib.h> //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
2 t# r/ p9 w/ m: l! u$ Y<netdb.h> //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等5 X. s1 ^; W( ?5 a' h
<arpa/inet.h> //某些函数声明,如inet_ntop()、inet_ntoa()等% |( p$ C7 D5 H: N% ^ G; R. e, G
<netinet/in.h> //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
* T& Q& T. m& W- H* w' ?2 i5 Q. d9 r" e$ k+ v! C; H
[size=13.3333px]#include <sys/socket.h> //connect,send,recv,setsockopt等& K& I! W5 n$ K t! o6 h, U7 }
#include <sys/types.h> : `7 z) N B, ]5 r( M2 M5 ^& J, f
# A' W- s" W3 {! W! e, f: ^ `' ?5 \#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons3 p# f3 P1 x2 T5 M' O. n! c
#include <poll.h> //poll,pollfd* a t( X4 e1 ?1 }, n' y# ?) y
#include <arpa/inet.h> //inet_addr,inet_aton3 m* k. j4 {0 \& j5 N- ^/ r! J% Z' B
#include <unistd.h> //read,write
* r# V: `; q) `#include <netdb.h> //gethostbyname
/ L" b) a+ L2 Y0 R. w, W' m( Y
$ a* X( z9 A3 q$ J. g- H#include <error.h> //perror* L4 m9 J# D8 T) ]; k
#include <stdio.h>
6 F. X8 ?& a0 X0 ~( L' `4 o#include <errno.h> //errno9 W$ ^& G B9 V. W P8 ?; b8 G, {' n B. |
0 z3 W7 q: N/ \7 B#include <string.h> // memset
1 L( Y. h; U+ m' d3 y2 U#include <string>
4 R! H8 U9 u, Y5 \- |#include <iostream>2 g: B+ J. I9 W5 @
! J. f: G* P0 E4 r: B
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |