微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UNIX域套接字,发送超时,零复制

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

我的疑问是:

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

所以我的电话:

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

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

有没有可能是Linux文件描述符0 1 2不适用于标准input,标准输出和标准错误

套接字和multithreading

无法通过非认NIC发送多播

在Windows下处理多个客户端连接的最佳方法(不使用线程)?

将networking字节顺序(大端)转换为小端

由于我使用SOCK_DGRAM,发送超时会有什么意义吗?

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

大尺寸1mega造成高cpu

描述符通过unix域套接字传递

为什么java多播接收器无法在Windows XP上接收数据包?

多端口监听套接字linux

如何检测哪个networking接口在Windows 7中使用c + +接收UDP数据包?

sendto函数在返回之前不等待接收者接收数据。 所以是的,为了达到这个目的,数据将被复制到内核拥有的缓冲区中,然后由接收过程再次复制出来。

原因:如果情况并非如此,那么两个进程交换消息或多或少是不可能的。 如果进程P2试图发送消息到进程P2,它将不会成功,直到P2被read 。 如果P2正在尝试向P1发送一个消息,在P1 read之前它不能成功。 但P1正在等待阻塞呼叫sendto 。 这些进程将会陷入僵局。

内核缓冲是解决这个问题的方法

Ben本来就很好,但是这里还有其他的东西。

让我们假设我们将允许在域套接字上进行零复制,并让我们说我们允许sendto()阻塞,直到recvfrom()被调用以离开内核缓冲区。 我在内核中看到了一个令人头痛的问题 – 我们不得不将这个页面翻译成接收过程(这意味着最好是整个页面),而且,如果一切都没有执行完毕,您无论如何都会得到副本。 发件人无法调用free()或重用缓冲区,因为这会强制使用pagefault-copy。

丑,只是丑。 没有人会费心写这些难以使用的东西。 唯一足够大的unix域套接字的用户是X,X不保证消息的大小。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐