cncml手绘网
标题: socket编程需要哪些头文件 [打印本页]
作者: admin 时间: 2020-5-8 23:01
标题: socket编程需要哪些头文件
[size=13.3333px]一 三种类型的套接字:
: f+ @/ l3 _( L2 v; T. U4 g) t1.流式套接字(SOCKET_STREAM)
% o: w$ S( \2 R" ]' t E5 m! t 提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。
1 u* u3 M! @# y/ M2.数据报式套接字(SOCKET_DGRAM)
2 o: i" ` ]( p! ^! Z8 O 提供无连接的数据传输服务,不保证可靠性。; ?; ~5 g9 M) {
3.原始式套接字(SOCKET_RAW); D% W' v% f7 r% U! p
该接口允许对较低层次协议,如IP,ICMP直接访问。1 Y, _# Q/ k; o# Q, R
# f! e# R! D2 i; q$ w$ M6 X" A/ i二 基本套接字系统调有有如下一些:4 ~9 }7 C1 q" `8 F* m9 _" P* G% q
创建套接字: socket()/ ]! t3 a$ G/ X* x7 {. W+ R& x
绑定本机端口: bind()/ ~, x" i( {9 O7 a- ?
建立连接: connect(),accept()& x \+ m1 m& Q3 d
侦听端口: listen()
6 w$ T! S0 m! o0 ]+ a# }3 } 数据传输: send(), recv()
; r* v. u) i' n! D 输入/输出多路复用: select()5 O) w. k" h/ k
关闭套接只: closesocket()+ g& j- }! |5 L/ M# I$ f, E* B* M
" u: o. N' @: A2 u+ G
三 数据类型3 J4 T6 v8 S; `
struct sockaddr+ J, ^# H- c; P4 }0 h& X. Y4 ~
{5 p. ~+ Z [. Q4 g* j( _. I
unsigned short sa_family; //地址族, 一般为AF_INET
* U! V: a z- c; Y3 l7 C/ C% Z6 L6 `, F; s char sa_data[14]; //14字节的协议地址
* E+ k$ w# M! ?5 k }$ N" p L/ {0 Y8 Y7 h+ n
: N/ H, \4 t, W6 o struct sockaddr_in
/ W( M2 o+ \9 ]- i- e* ?; {' \ {
$ R1 [) T x% N0 V2 `7 g. i: v* ^ short int sin_family; //地址族( k+ C4 Z5 `$ D& ?% X- w
unsigned short int sin_port; //端口号
7 j& V0 w8 E7 A0 `; ~& d struct in_addr in_addr; //ip地址
5 z# Z* f5 m; |0 z8 q unsigned char sin_zero[8]; //填充' m" f4 y1 Z! P# n; M
}
# U) ^1 G& L' r) Z+ h/ e) V( r2 G( V$ T ?/ ^8 g
四 常用函数
- l( V, S3 f& j" s. P M* s 1 socket()$ z; C. ^$ e' _
头文件:
7 W2 C, z; m# [' m Z #include <sys/types.h> s2 m, u9 A) l0 t6 i& g! W6 S% k
#include <sys/socket.h>6 @% v* Y4 q# T) O7 N. ~; @
函数原型:
+ s& `3 b {, y4 O int socket(int domain, int type, int protocol)
: k) ?3 v7 \" F' `& v3 A1 p8 @4 h domain: 协议类型,一般为AF_INET
8 B0 {; H- s: s; s- l type: socket类型
% h- k; R* \# M. m( { protocol:用来指定socket所使用的传输协议编号,通常设为0即可
" c5 F" V: A" q. C+ B% s5 V) e$ x
2 bind()! j, H: {( P$ Y
头文件:
* J Q) \9 G9 j8 b9 D& s5 ?6 S8 G' Y/ }7 v #include <sys/types.h>
, r( n5 Z c5 @ #include <sys/socket.h>
1 U: s5 H. q2 F. f3 B+ O 函数原型:
, L3 K9 L' e/ c t4 ] int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
9 A4 E& a/ E2 q' L$ f" y9 _) l sockfd: socket描述符0 o+ U* l& W5 d6 f
my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
' p; L: {2 q4 [- v" |' u6 {/ o" ~ addrlen:常被设为sizeof(struct sockaddr)$ o, s2 R: V+ f) u/ w
6 F" `8 y# p' N2 o* w. F
3 connect()( `/ u3 r3 Q9 j$ r
头文件:
' R' `& q2 I+ B/ t6 ? #include <sys/types.h> 8 k6 a$ C# `" C( M8 c3 ?* W
#include <sys/socket.h>
$ p% l( v( b- b- `) l7 S 函数原型:
- P) d" U1 ]1 j! X7 a6 a/ j int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)# O. d, ]2 \7 ]3 M2 x$ z5 _; P4 c
sockfd: 目的服务器的socket描述符
* J! |/ k: X. L S serv_addr:包含目的机器ip地址和端口号的指针4 S; j4 ]1 Z$ c( k; i; o
addrlen:sizeof(struct sockaddr)3 E: x j, _0 ?% J
! Z# k$ e+ N# S2 Z/ y5 [6 x 4 listen()
1 C( o; d4 a* J1 U5 o) \ 头文件:6 D1 P1 W" h/ X I% E8 z7 e! _/ o
#include <sys/socket.h>7 D" t5 M& f% f& n4 _
函数原型:: k+ s5 D1 S7 B1 ~+ b
int listen(int sockfd, int backlog);
% _5 x$ J/ J' I: R/ R6 [ sockfd:socket()系统调用返回的socket描述符/ c6 r7 @9 S$ S ]4 x% b: Q5 Y# m
backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
: q$ V" n0 _0 o1 I u9 Z; z) H" W$ W2 A- g
5 accept()9 F. Q: l# v+ ~( p( ]7 c
头文件:
B1 U `' p3 [ #include <sys/types.h>
, V% N* H2 ?6 ? #inlcude <sys/socket.h>7 j* D) n* C4 I% M
函数原型:# G/ w$ |7 b; X% p, L5 a' r
int accept(int sockfd, void *addr, int addrlen)
( @6 R7 p+ ]2 H sockfd:是被监听的socket描述符# t5 O& v K6 e& y7 |$ e' A% w
addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
0 z; u! E4 ?% i2 X8 P addrlen:sizeof(struct sockaddr_in)+ C! V* x, b6 h3 T! N
% l2 L+ S C0 w q6 a5 P2 }# a 6 send()
# F7 ~6 @% ^7 ?$ f, Q 头文件:
* ]! h T" Q6 v8 e+ L4 M- U+ g0 Q #include <sys/socket.h>& U' O3 p6 O. J2 S6 J! n+ `
函数原型:
- r5 o( M* s2 w4 ?$ |# Q+ A int send(int sockfd, const void *msg, int len, int flags);
5 |- u% Y3 V) {; W5 S2 y sockfd:用来传输数据的socket描述符
- p- Q4 H- Y( ~8 _+ B msg:要发送数据的指针 6 }6 J0 b( j( U4 z+ a+ D7 m4 D4 Z
flags: 0' [" ?$ A) R4 K
. h- E+ A$ z- D; M 7 recv()# A! ]( O, y2 H6 y9 w! A- ?0 p
头文件:* \% |+ V7 {# K/ @8 H R2 v! l+ E
#include <sys/types.h> E2 G/ \+ G1 {4 Y9 v
#include <sys/socket.h>
; k. d- Z2 e! z0 x5 J" ?/ c, B7 W, S 函数原型:3 X' C* r2 x5 r4 A! X$ h& d
int recv(int sockfd, void *buf, int len, unsigned int flags)3 ~0 h/ N% F5 N; u4 D& k2 m, o6 F
sockfd:接收数据的socket描述符
2 V* P* ^. e* U% n( n; K1 O buf:存放数据的缓冲区! R. W3 V- C' C7 W/ K. [- ?4 _; X
len:缓冲的长度
; @1 r$ U4 L* S flags:0
' D" Y g: D# ?+ ?# J6 v5 [
+ y* r9 S8 b# e& b3 z 8 sendto()
. k$ @: J% Y1 V+ h! G! Y& k 头文件:
# @, [1 ]0 o1 p( Z* @3 }3 C #include <sys/types.h>$ k' I+ n' |5 Z. a& Q) Z- @7 S$ x
#include <sys/socket.h>2 k% W# \ L5 g v% Z
函数原型:4 z ~9 O8 G% m! l0 Q
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
: q' ?3 ^+ i! `6 B * R7 K, ^& s/ |; u( [
( z! U9 O1 W/ M1 {8 } 9 recvfrom()& L7 Y, O: z! d2 ^5 ?
头文件:
6 `) K- F% j4 D, J4 a* v #include <sys/types.h>
* |/ L- G+ h+ v% z+ ~- k #include <sys/socket.h>
1 [1 A* B; k B1 v1 F7 N n 函数原型:
; T) J& K* F3 J; F! L" T3 C int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)
" Z1 |, t. j8 S* @4 u! Y8 B: N7 L+ [, Y2 F8 j M
4 O8 T1 H# q0 \8 w6 C 10 read() write()
9 d1 c( g. l$ S% Q; ~. D# x9 a int read(int fd, char *buf, int len)
! t) {) _* y7 Y. L9 ?5 e int write(int fd, char *buf, int len)
' k, @- t9 t+ U/ Q p+ I9 a4 p& p 5 \' z: X& d3 k' Z8 S: [( J
11 shutdown()
0 l& v, B/ c% C- X! t4 Z close(sockfd)
1 r5 n9 x, o: `3 B% u0 c* G int shutdown(int sockfd, int how)
. F9 p( i, x1 O2 p% f9 w& 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等)
; d# G! t& y* y$ `% ?0 c0 a<sys/socket.h> //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
; y$ t- Y3 o* J7 N& x( I- a/ [5 _<sys/ioctl.h> //I/O控制操作相关的函数声明,如ioctl()
2 @5 Y! L6 f- B6 p9 A+ l" F<stdlib.h> //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等! l7 D( D* |7 w O; K0 D
<netdb.h> //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等 n- A3 j; N$ [% M0 m
<arpa/inet.h> //某些函数声明,如inet_ntop()、inet_ntoa()等
5 n3 P5 V$ X4 G1 M9 g" J( D<netinet/in.h> //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
6 G0 p7 X, q- k" V/ P+ i& l1 t
4 U8 U5 P2 p$ f. X# X4 X+ G[size=13.3333px]#include <sys/socket.h> //connect,send,recv,setsockopt等
, x4 m0 k( a0 F# x' b, ]% _- s#include <sys/types.h>
% z3 k( N2 f3 f' e9 b u' G( Z* t$ X) {" i' n& ^
#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons
4 u$ l" O9 R! f* }% U) E! F#include <poll.h> //poll,pollfd
4 f3 p3 l+ Y% f: t# ]9 [0 u#include <arpa/inet.h> //inet_addr,inet_aton3 y+ k d5 G! ^ O! F8 o/ T
#include <unistd.h> //read,write/ Z8 {" E" e0 @0 I) I8 l- b
#include <netdb.h> //gethostbyname2 [5 k: L( h$ {+ n
' {3 r( U4 i" N9 N, w: P#include <error.h> //perror
8 F0 X' d: o# j) |, t1 _, A5 Y#include <stdio.h>
9 Q4 |7 `' Z% Z1 e* t" p( \#include <errno.h> //errno
7 U R* I/ a$ ^' o. E8 m! S, q9 [8 ]) |
#include <string.h> // memset
: o" X j1 A' x- r& L#include <string>9 ]% N: f$ v! f, j, A; l ]
#include <iostream>( @) x0 Z4 Z0 K' K2 Z' {
5 U% n p7 P6 t3 U* S/ z3 L8 j
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |