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

时间:2010-01-24 20:36:01

标签: c windows sockets udp winsock

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

我知道UDP通常不适用。

5 个答案:

答案 0 :(得分:31)

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

答案 1 :(得分:7)

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

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:2)

Loopback UDP在许多平台上都非常不可靠,您可以轻松看到50%以上的数据丢失。已经给出了各种各样的借口,即使用更好的运输机制。

目前有许多中间件堆栈可以使IPC更易于使用和跨平台。查看ZeroMQ29 West's LBM之类的内容,它们使用相同的API进行进程内,进程间(IPC)和网络通信。

答案 4 :(得分:1)

套接字接口可能不会控制数据的发起者,所以如果你有更高级别的流量控制,你可能会看到可靠的传输,但是内存紧缩仍然可能导致数据报丢失。

如果没有流量控制限制数据报的内核内存分配,我想它会像网络UDP一样不可靠。