我正在学习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] 举报,一经查实,本站将立刻删除。