您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11754|回复: 0
打印 上一主题 下一主题

[C] socket编程需要哪些头文件

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-8 23:01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[size=13.3333px]一 三种类型的套接字:
) U+ X5 R+ y/ {5 o( i( X1.流式套接字(SOCKET_STREAM)# j- ^: Z- T- |( R
    提供面向连接的可靠的数据传输服务。数据被看作是字节流,无长度限制。例如FTP协议就采用这种。
7 I3 B/ e, ~* ^9 E4 _2.数据报式套接字(SOCKET_DGRAM)) {  A, V* G7 T3 N8 z( `
    提供无连接的数据传输服务,不保证可靠性。6 ~8 R( j2 @8 C% h- \7 ^
3.原始式套接字(SOCKET_RAW)
  R* \: Z- l( o0 W    该接口允许对较低层次协议,如IP,ICMP直接访问。5 A6 Z% j. y5 J9 E9 R' ~) g$ R
5 O8 [/ k+ v0 q0 l- d0 B
二 基本套接字系统调有有如下一些:
! c; d5 u! \0 t6 f* p8 b    创建套接字: socket()5 {8 S( B: U: D( P
    绑定本机端口: bind()
1 ~6 C$ i  ^# a- |; M# e; S    建立连接: connect(),accept()& d$ r8 M' {8 _: i0 s( y9 _$ Y, k: r
    侦听端口: listen()0 t8 y! Q( ?7 q( J0 b  }5 r5 [: Y
    数据传输: send(), recv(). f! d7 T& R: |+ a' }
    输入/输出多路复用: select()2 x1 I1 {6 T* ]* q: O/ {4 p
    关闭套接只:   closesocket()" M/ Q3 {( w) R/ A# k& d
   
" a2 [$ B2 G, X( t三 数据类型9 a9 P6 \& F. n& {
    struct sockaddr5 k  B/ Z% j' P' C: x, j6 C' e
    {
; F" v8 ^7 Q9 G9 {; M       unsigned short  sa_family;   //地址族, 一般为AF_INET$ u' f7 E7 a, e/ g
       char                  sa_data[14];   //14字节的协议地址
- L. j% c# _6 `$ H2 k& [- u* X    }
6 Y, s6 j+ l6 q' j) Y3 O! X! o0 ~) ]# h" o+ W, [
    struct sockaddr_in  x2 J+ C  N" j9 e- N6 M! {
    {) ^! A$ I& z* N3 b7 i
       short int                     sin_family;   //地址族
" P8 o. \( ^' x% U' @' `2 L       unsigned short int      sin_port;      //端口号0 Q6 O  }! p4 t  i- ?( V
       struct in_addr             in_addr;      //ip地址
, y& k( W' N# s% N. ?* O2 E       unsigned char             sin_zero[8];  //填充* b2 K) V6 R8 H& S
    }& n( }; ~* E1 Q, w

7 E1 `8 K6 b% e. y2 p2 C1 D四 常用函数
( D' F! L* }8 y7 ?9 c. U* c+ |" e    1 socket()% |# N. @$ L$ o6 [* w" @
       头文件:
4 T0 i3 _- {8 g/ W9 \( a4 k2 {       #include <sys/types.h>
+ F  j. H& F* X! T       #include <sys/socket.h>4 T' T5 @. j5 W, F
       函数原型:
: J# x2 N+ k2 R8 D( a$ z" ~       int socket(int domain, int type, int protocol)/ k" F" p# g# d2 y- z
          domain: 协议类型,一般为AF_INET* C# B+ ~9 y- s, P
          type: socket类型
: Z" A0 G+ E3 |9 \! Q9 I; o# b          protocol:用来指定socket所使用的传输协议编号,通常设为0即可. M5 T0 A1 S; r# y
: H7 Y' v! c; u3 a: Y6 G3 y
    2 bind()# d5 M& @( _% H0 @: s8 k
       头文件:
7 L, B( g2 z  k% V3 ^3 O2 W, S       #include <sys/types.h>3 j5 _, h. Y0 _, g/ o5 V
       #include <sys/socket.h>
1 G% h( x% g, a9 u) b       函数原型:! r% z7 i+ d* q: M! V+ Y
       int bind(int sockfd, struct sockaddr *my_addr, int addrlen)' }' H, ?* `+ D) d5 z
          sockfd: socket描述符7 P+ l$ y* F% r! L! ]4 W
          my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
/ @% e4 w, A* z          addrlen:常被设为sizeof(struct sockaddr). ]' }4 G. ]) Q# n: b: Q
# T" y$ h$ M8 J. K8 E0 i0 l
    3 connect()
* L$ D3 R" Q  R& |       头文件:. L( X2 ]+ S9 h4 H
       #include <sys/types.h>  $ J" c4 S6 j# Z: p8 D# T
       #include <sys/socket.h>: a, ]6 f" P! E6 I. U9 E; G
       函数原型:. g& l9 F- n' E2 Q, B! ^
       int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)1 o: E& I6 k/ Q. V: @+ {
           sockfd: 目的服务器的socket描述符
& x/ x2 p" h, B1 W           serv_addr:包含目的机器ip地址和端口号的指针
4 N" ]" N; t* l; X# B           addrlen:sizeof(struct sockaddr)  g, X7 m3 \3 v6 w) i
8 z5 A5 f$ `; ~
    4 listen()
. ?/ w: x" [+ B: t       头文件:
1 Q# I0 _2 R1 W5 s4 Z1 C8 {4 l4 a8 p       #include <sys/socket.h>
: b0 a- A( V# ]! ]5 |) D/ \       函数原型:# u( J( ?! D* P5 N
       int listen(int sockfd, int backlog);
, W' A- l; V& d/ T9 s9 u           sockfd:socket()系统调用返回的socket描述符
# ?7 _, x, D/ h% B9 q           backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。' d" O' |1 ~. y

) i& n! o8 C% B# L/ f    5 accept(): T& Y" J& \6 Q0 B2 Z! x
       头文件:   1 D' f* @" i6 V
       #include <sys/types.h>' i% S; T) S6 ^; q4 I/ W2 R
       #inlcude <sys/socket.h>
' [# C$ K2 ^0 E( w! l  ]2 p       函数原型:6 i2 d# o$ a6 d! Q6 f% M6 q
       int accept(int sockfd, void *addr, int addrlen)
3 q" J( H  |' M3 v+ J           sockfd:是被监听的socket描述符
  G0 N# O! Q7 H# g8 z! e" p           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
3 q& k! }& s) T; S           addrlen:sizeof(struct sockaddr_in)3 }8 ?- s8 S  j% f3 B
      
4 B; X* z4 _2 o8 B; ?' J5 L2 x    6 send()
! f3 R, I! J& T  t        头文件:
8 Z% g8 U. j$ S: G        #include <sys/socket.h>4 \" ~% `' D3 V4 j, ]
        函数原型:; j+ D5 b9 b6 {/ F
        int send(int sockfd, const void *msg, int len, int flags);% ?3 A* S* H: e+ h' T
           sockfd:用来传输数据的socket描述符
* w, s% Z. A! k0 g4 Q; ^" @( [3 k           msg:要发送数据的指针
* {$ }. B) e4 K4 ]           flags: 0* E8 J/ N/ o+ P4 f/ z4 G
      
, h8 j% l% o0 {& r0 T    7 recv()
& X" x* \! R5 \1 u* G        头文件:$ n0 ~8 S. P8 l9 b
        #include <sys/types.h>( ^' C9 c  X  N5 [3 b% `. W7 y
        #include <sys/socket.h>
3 J2 @3 `5 e: f0 u) A8 M$ R0 B        函数原型:$ I* P  O- X9 n/ v
        int recv(int sockfd, void *buf, int len, unsigned int flags)1 C+ M3 L% n- I8 A
          sockfd:接收数据的socket描述符4 |9 M6 @* N: H9 J4 Q5 }
          buf:存放数据的缓冲区
5 |% h$ H' L* s# [- K          len:缓冲的长度
$ J- s. k0 u  p8 ?8 }/ a7 T$ i3 o          flags:0
% t" _: ~* a5 }8 N* h: [" B
. N2 m2 t! v- k: g, x    8 sendto()
6 \, q6 d! Q6 e, u       头文件:% f8 K* ]8 T) x4 l& c% U
       #include <sys/types.h>* W0 {$ a+ W+ D9 ^4 ~
       #include <sys/socket.h>/ {5 H4 m3 ^  V5 r; r6 |' T
       函数原型:
8 c' |. f. I- Q       int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);! T2 }( z4 O  p* `' V+ a
        2 k: G3 i0 G/ C* _
   
. c# [0 T/ S  w8 X. H0 n3 @    9 recvfrom()
9 F( j  s' b8 ?8 h       头文件:* N$ e- G0 h. K$ N5 `8 B$ h" E
       #include <sys/types.h>
" @0 o- K" V( O- c4 u0 P       #include <sys/socket.h>( ?. ]7 t3 G" Z  h& {1 A. ]3 F* Z
       函数原型:$ Q% `3 [. A8 B# }; U
       int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)! `, d- Z3 |4 u6 L3 l% k! X
/ a7 k* {* ~, t. B
    & y" u& \( x: P* ?
    10 read() write(); Y3 q4 K- m' f% I
       int read(int fd, char *buf, int len)5 I$ q- c, c, G
       int write(int fd, char *buf, int len)
* P, A5 f- y  O; W6 b       - g+ m  X9 ^) k. x" T' y
    11 shutdown()/ E! f1 o" X% N, s! r* ^& [
       close(sockfd)
- S# ]2 c5 F) k% ^       int shutdown(int sockfd, int how)& [2 `- A" w) L. u" p0 d& f  ?. w! _- O
-----------------------------------
[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等)   # X5 {$ C' v7 P- t% v. v5 h& @; h6 ]
<sys/socket.h>         //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
( |$ \8 X6 [- Y0 w<sys/ioctl.h>             //I/O控制操作相关的函数声明,如ioctl()
2 ^6 h4 c( U/ e! p$ _" j# b<stdlib.h>                   //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
/ D9 b4 }: E# s- k. J* g<netdb.h>                  //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等( K, a" \$ h4 D6 B
<arpa/inet.h>           //某些函数声明,如inet_ntop()、inet_ntoa()等
: ]# C% C8 q9 g; s4 G3 E9 F$ l2 ^5 H: a<netinet/in.h>          //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
[size=13.3333px]------------------------------
[size=13.3333px]linux下socket编写常用头文件
* K0 R) R! I7 |
+ @, c( Y3 l* Z4 Z; \7 e[size=13.3333px]#include <sys/socket.h>   //connect,send,recv,setsockopt等
4 |7 A+ w  n; Z#include <sys/types.h>      
5 ?! G( @9 O9 h  p# J( m/ l6 D# J) V- M0 }+ {( d3 {! u5 E
#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons
+ ]6 l; X+ z1 k7 }3 J: L6 V( @- u#include <poll.h>             //poll,pollfd; D0 n) W5 P8 B: A' f& s0 i
#include <arpa/inet.h>   //inet_addr,inet_aton+ ?+ v- \$ T6 f: Z  \
#include <unistd.h>        //read,write
  y* B: B) I" U% G#include <netdb.h>         //gethostbyname1 P' k) p+ ~# P8 k, Y6 t
7 o6 O& }& \: e0 i1 ]
#include <error.h>         //perror
: x7 _3 a) K0 O. _+ Q#include <stdio.h>
  J! l/ _! n* P- l# m! b#include <errno.h>         //errno$ ~6 r5 e" q6 i% m3 ]* d, t

1 y( G6 a" L# W0 Y#include <string.h>          // memset: Z+ J1 r$ U( v! W7 \
#include <string>- F7 |7 a, ]; h# Y' R- |5 p
#include <iostream>
- q6 Y# d) h& v* t5 y

. H; n; o9 d0 G! i% }" a" j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-11-17 01:21 , Processed in 0.117016 second(s), 22 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!