一、套接字概述:
套接字是一种通信机制(通信两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信。我们可以用套接字中的相关函数来完成通信过程。
套接字的特性有三个属性确定:域(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![]()
-
int sockfd;
-
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
-
if(sockfd < 0)
-
{
-
perror("socket");
-
exit(-1);
-
}
套接字地址每个套接字(端点)都有其自己的地址格式,对于 AF_UNIX 套接字来说,它的地址由结构 sockaddr_un 来描述,该结构体定义在头文件 sys/un.h 中,如下:
[objc] view plaincopy![]()
-
struct sockaddr_un {
-
sa_family_t sun_family; //套接字域
-
char sun_path[];//名字
-
};
而在 AF_INET 域中,套接字地址结构由 sockaddr_in 来指定,该结构体定义在头文件 netinet/in.h 中:
[objc] view plaincopy![]()
-
struct sockaddr_in {
-
short int sin_family;//套接字域
-
unsigned short int sin_port;//端口
-
struct in_addr sin_addr;
-
}
IP 地址结构 in_addr 被定义如下:
[objc] view plaincopy![]()
-
struct in_addr {
-
unsigned long int
-
}