通过同一台机器上的UDP套接字发送数据是否可靠?

Lot*_*har 24 c sockets windows udp winsock

如果我使用UDP套接字进行进程间通信,我可以期望其他进程以相同的顺序接收所有发送数据吗?

我知道UDP通常不是这样.

Bri*_*new 32

不,我以前一直被这个咬过.您可能想知道它可能会如何失败,但是您将遇到挂起的数据包缓冲区问题,因此数据包将被丢弃.网络子系统如何丢弃数据包取决于实现,而不是在任何地方指定.

  • 使用 setsockopt 设置一个大的 recv 缓冲区会有所帮助,但可能并不能保证任何事情。当然,我的测试表明它对 Windows 7 上的数据包丢失有直接影响。但是没有流量控制,你只是在延迟不可避免的事情。 (2认同)

Ale*_*x M 6

简而言之,没有.您不应该对UDP套接字上收到的数据顺序做任何假设,即使是在localhost上也是如此.它可能会起作用,也可能不起作用,并且不能保证.


Con*_*lls 5

不,即使使用本地插座,也没有这样的保证.如果您想要一个IPC机制来保证按顺序交付,您可能会考虑使用全双工管道popen().这将打开子进程的管道,可以任意读取或写入.它将保证按顺序交付,并可与同步或异步I/O(select()poll())一起使用,具体取决于您希望如何构建应用程序.

在unix上还有其他选项,例如unix域套接字或System V消息队列(其中一些可能更快)但是从管道读取/写入非常简单且有效.作为奖励,它很容易测试您的服务器进程,因为它只是从Stdio读取和写入.

在Windows上你可以查看命名管道,它的工作方式与它们的unix同名有些不同,但它们恰好用于这种进程间通信.