​一、套接字概述:

    套接字是一种通信机制(通信两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信。我们可以用套接字中的相关函数来完成通信过程。

    套接字的特性有三个属性确定:域(domain),类型(type),协议(protocol)。

二、套接字的域

    域指定套接字通信中使用的网络介质,最常见的就是AF_INET(ipv4),xuduolinux局域网1都是实用的该网络,当然1因特网自身用的也是他。

三、套接字类型:

流套接字:SOCK_STREAM:用于提供面向连接,可靠的数据传输服务。

数据报套接字:SOCK_DGRAM:提供了面向无链接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中出现丢失。

原始套接字:SOCK_RAW:原始套接字可以读写内核没有处理的ip数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。

四、套接字协议(协议类型)

创建套接字:socket系统调用创建一个套接字并返回一个描述符,该描述符可以用来访问该套接字。

头文件:#include<sys/socket.h>

int socket(int family,int type ,int protocol);

功能:创建一个用于网络通信的socket套接字(描述符)

参数:family:协议族

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#define AF_UNSPEC       0               /* unspecified */
#define AF_UNIX         1               /* local to host (pipes, portals) */
#define AF_INET         2               /* internetwork: UDP, TCP, etc. */
#define AF_IMPLINK      3               /* arpanet imp addresses */
#define AF_PUP          4               /* pup protocols: e.g. BSP */
#define AF_CHAOS        5               /* mit CHAOS protocols */
#define AF_IPX          6               /* IPX and SPX */
#define AF_NS           6               /* XEROX NS protocols */
#define AF_ISO          7               /* ISO protocols */
#define AF_OSI          AF_ISO          /* OSI is ISO */
#define AF_ECMA         8               /* european computer manufacturers */
#define AF_DATAKIT      9               /* datakit protocols */
#define AF_CCITT        10              /* CCITT protocols, X.25 etc */
#define AF_SNA          11              /* IBM SNA */
#define AF_DECnet       12              /* DECnet */
#define AF_DLI          13              /* Direct data link interface */
#define AF_LAT          14              /* LAT */
#define AF_HYLINK       15              /* NSC Hyperchannel */
#define AF_APPLETALK    16              /* AppleTalk */
#define AF_NETBIOS      17              /* NetBios-style addresses */
#define AF_VOICEVIEW    18              /* VoiceView */
#define AF_FIREFOX      19              /* FireFox */
#define AF_UNKNOWN1     20              /* Somebody is using this! */
#define AF_BAN          21              /* Banyan */
 
#define AF_MAX          22

套接字类型:socket

 

1
2
3
4
5
6
7
* Types
 */ 
#define SOCK_STREAM     1               /* stream socket */
#define SOCK_DGRAM      2               /* datagram socket */
#define SOCK_RAW        3               /* raw-protocol interface */
#define SOCK_RDM        4               /* reliably-delivered message */
#define SOCK_SEQPACKET  5               /* sequenced packet stream */

创建 UDP 套接字示例:

 

[objc] view plaincopy在CODE上查看代码片派生到我的代码片

 

 

  1. int sockfd;  

  2. sockfd = socket(AF_INET, SOCK_DGRAM, 0);  

  3. if(sockfd < 0)  

  4. {  

  5.     perror("socket");  

  6.     exit(-1);  

  7. }  

 

 

套接字地址

每个套接字(端点)都有其自己的地址格式,对于 AF_UNIX 套接字来说,它的地址由结构 sockaddr_un 来描述,该结构体定义在头文件 sys/un.h 中,如下:

[objc] view plaincopy在CODE上查看代码片派生到我的代码片

 

 

  1. struct sockaddr_un {  

  2.     sa_family_t  sun_family; //套接字域  

  3.     char         sun_path[];//名字  

  4. };  

 

而在 AF_INET 域中,套接字地址结构由 sockaddr_in 来指定,该结构体定义在头文件 netinet/in.h 中:

[objc] view plaincopy在CODE上查看代码片派生到我的代码片

 

 

  1. struct sockaddr_in {  

  2.     short int  sin_family;//套接字域  

  3.     unsigned short int   sin_port;//端口  

  4.     struct in_addr   sin_addr;  

  5. }  

 

IP 地址结构 in_addr 被定义如下:

 

[objc] view plaincopy在CODE上查看代码片派生到我的代码片

 

 

  1. struct in_addr {  

  2.     unsigned long int  

  3. }