c - UNIX 域套接字、发送超时、零拷贝

标签 c linux sockets unix unix-socket

我正在学习 UNIX 域套接字并尝试一些客户端服务器程序。我正在使用 SOCK_DGRAM 套接字系列。

我的疑问是:

  1. 在发送和接收时是否使用 UNIX 域套接字将缓冲区从用户空间复制到内核空间缓冲区?

所以我的电话:

sendto(send_thread_socket, (void*)argData, sizeof(*argData), 0,
                                        (struct sockaddr *)&dpdkServer, sizeof(struct sockaddr_un))

它将缓冲区复制到某个内核空间缓冲区还是直接复制到接收进程的用户空间缓冲区。由于 UNIX 套接字在文件系统 namespace 上工作,我认为它不应该复制缓冲区。

  1. 由于我使用的是 SOCK_DGRAM,发送超时是否有意义?

假设我正在使用相同的 sendto() 调用,但接收方不保证任何及时收集数据,我可以有一个发送超时。

最佳答案

sendto 函数在返回之前不会等待接收方接收到数据。所以是的,为了实现这一点,数据将被复制到内核拥有的缓冲区,然后由接收进程再次复制出来。

原因:如果不是这种情况,那么两个进程将或多或少地无法交换消息。如果进程 P1 试图向进程 P2 发送消息,直到 P2 调用 read 才会成功。如果此时 P2 正在尝试向 P1 发送消息,则在 P1 调用 read 之前它不会成功。但是 P1 正在等待对 sendto 的阻塞调用。进程将陷入僵局。

内核缓冲是解决该问题的方法。

关于c - UNIX 域套接字、发送超时、零拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34772486/

相关文章:

c++ - WIN32 API 项目中的 ReadDirectoryChangesW 错误?

c++ - 时间术语

java - 对于程序中的小值和大值,整数加法是否需要恒定的时间?

c++ - 在 C/C++ 中迭代字母表

c++ - 使用信号处理程序处理从 fifo 接收的数据

更改 HBITMAP 分辨率以减小文件大小

python - 如何为 "embedded"Raspberry Pi 创建简单的 GUI?

linux - 用于创建名称从 00 到 ff 的文件夹的 bash 脚本

c# - 如何使用 C# 语言通过 TCP 发送十六进制代码

java - 具有循环消息传递的简单客户端服务器