linux - 为什么 socketpair() 允许 SOCK_DGRAM 类型?

标签 linux sockets socketpair

我最近一直在学习 Linux 套接字编程,主要来自 this site .

网站说使用域/类型组合 PF_LOCAL/SOCK_DGRAM...

Provides datagram services within the local host. Note that this service is connectionless, but reliable, with the possible exception that packets might be lost if kernel buffers should become exhausted.

那么,我的问题是,根据它的手册页,为什么 socketpair(int domain, int type, int protocol, int sv[2]) 允许这种组合...

The socketpair() call creates an unnamed pair of connected sockets in the specified domain, of the specified type...

这不是自相矛盾吗?

我认为 PF_LOCALPF_INET 域中的 SOCK_DGRAM 隐含 UDP,这是一种无连接协议(protocol),所以我无法调和与 socketpair() 创建连接套接字的声明冲突。

最佳答案

数据报套接字具有“伪连接”。该协议(protocol)实际上没有连接,但您仍然可以调用 connect()。这将一个远程地址和端口与套接字相关联,然后它只接收来自该源的数据包,而不是所有目的地是套接字绑定(bind)到的地址/端口的数据包,你可以使用 send( ) 而不是 sendto() 发送回这个远程地址。

TFTP 协议(protocol)可能会用到它。服务器最初在众所周知的端口上监听传入请求。传输开始后,将使用不同的端口,发送方和接收方可以使用 connect() 将套接字与该对端口相关联。然后他们可以简单地在那个新套接字上发送和接收以参与传输。

同样,如果您对数据报套接字使用 socketpair(),它会在两个套接字之间创建一个伪连接。

关于linux - 为什么 socketpair() 允许 SOCK_DGRAM 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44316571/

相关文章:

Linux 内核 : what are instruction cache and mp-IRQ subsystem within a terms of function interception via replace?

java - 如何在java中的UDP无连接客户端-服务器对的固定端口上运行客户端程序

c++ - 使用 socketpair 时 SO_SNDBUF 的行为

linux - 如何将随机数写入文件?

c - 在 Mac OS X 上安装第三方 C 库

java - Android 中的安全套接字通信

python - gmailR错误 "Only AF_INET sockets are currently supported on jython"

c - 为什么这个套接字/文件描述符分配无效?

linux - 如何在没有提示的情况下执行 ssh-keygen