理解 Unix/Linux 上下文中的术语“套接字”

理解 Unix/Linux 上下文中的术语“套接字”

我知道术语“套接字”在 Unix/Linux 上下文中可以表示两种不同的含义:

  • Unix 套接字; 2个或多个进程之间的接口。
  • 一个IP套接字;进程与 1 个或多个通信服务(或机器)之间的接口。

一般定义是这两个总结还是在我们的上下文中还有更多“套接字”?

答案1

http://man7.org/linux/man-pages/man2/socket.2.html

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

描述

socket() 创建通信端点并返回引用该端点的文件描述符。成功调用返回的文件描述符将是当前未为进程打开的最小编号的文件描述符。

域参数指定通信域;这选择将用于通信的协议族。这些系列在 <sys/socket.h> 中定义。目前理解的格式包括:

   Name                Purpose                          Man page
   AF_UNIX, AF_LOCAL   Local communication              unix(7)
   AF_INET             IPv4 Internet protocols          ip(7)
   AF_INET6            IPv6 Internet protocols          ipv6(7)
   AF_IPX              IPX - Novell protocols
   AF_NETLINK          Kernel user interface device     netlink(7)
   AF_X25              ITU-T X.25 / ISO-8208 protocol   x25(7)
   AF_AX25             Amateur radio AX.25 protocol
   AF_ATMPVC           Access to raw ATM PVCs
   AF_APPLETALK        AppleTalk                        ddp(7)
   AF_PACKET           Low level packet interface       packet(7)
   AF_ALG              Interface to kernel crypto API

...

上面的列表并不全面。其他之一是AF_BLUETOOTH:-)。

套接字是您可以调用sendmsg()recvmsg()打开的东西。消息发送到套接字地址或从套接字地址接收。

还有更多详细信息,但它们在套接字类型之间有所不同。例如-

SOCK_STREAM套接字并不真正关心消息。它们传输字节流,就像 unix 管道的双向等价物。您可以使用write()read()调用而不会丢失任何内容。 (除了所谓的“带外”数据。这是已弃用并且主要被使用telnet。)

对于面向连接的套接字类型(包括 )SOCK_STREAM,每个套接字只能向一个对等地址发送数据/从一个对等地址接收数据。您必须使用 提前进行设置connect()。或者在另一边,bind()发送到特定地址,您可以接收而不是接收消息插座。也就是说,您通过调用 开始侦听listen(),然后通过accept()返回套接字的调用接收每个连接。

该类型SOCK_SEQPACKET被定义为面向连接(并且可靠、按顺序交付),但除此之外即使在标准内也有相互冲突的定义。而对于SCTP它可能会接收连接没有使用accept()我上面描述的调用。因此,如果您使用SOCK_SEQPACKET协议,请不要对其含义做出太多假设。查找有关您正在使用的特定协议实现的信息。

相关内容