我正在学习 UNIX 域套接字并尝试一些客户端服务器程序。我正在使用 SOCK_DGRAM 套接字系列。
我的疑问是:
- 在发送和接收时是否使用 UNIX 域套接字将缓冲区从用户空间复制到内核空间缓冲区?
所以我的电话:
sendto(send_thread_socket, (void*)argData, sizeof(*argData), 0,
(struct sockaddr *)&dpdkServer, sizeof(struct sockaddr_un))
它将缓冲区复制到某个内核空间缓冲区还是直接复制到接收进程的用户空间缓冲区。由于 UNIX 套接字在文件系统 namespace 上工作,我认为它不应该复制缓冲区。
- 由于我使用的是 SOCK_DGRAM,发送超时是否有意义?
假设我正在使用相同的 sendto() 调用,但接收方不保证任何及时收集数据,我可以有一个发送超时。
最佳答案
sendto
函数在返回之前不会等待接收方接收到数据。所以是的,为了实现这一点,数据将被复制到内核拥有的缓冲区,然后由接收进程再次复制出来。
原因:如果不是这种情况,那么两个进程将或多或少地无法交换消息。如果进程 P1 试图向进程 P2 发送消息,直到 P2 调用 read
才会成功。如果此时 P2 正在尝试向 P1 发送消息,则在 P1 调用 read
之前它不会成功。但是 P1 正在等待对 sendto
的阻塞调用。进程将陷入僵局。
内核缓冲是解决该问题的方法。
关于c - UNIX 域套接字、发送超时、零拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34772486/