一、套接字概述:
套接字是一种通信机制(通信两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信。我们可以用套接字中的相关函数来完成通信过程。
套接字的特性有三个属性确定:域(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
-
}