我知道术语“套接字”在 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
协议,请不要对其含义做出太多假设。查找有关您正在使用的特定协议实现的信息。