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

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

一般来说,我知道这不是真的。

不,我以前曾经被咬过。 你可能想知道它是如何失败的,但是你会遇到悬而未决的数据包缓冲区问题,因此数据包将被丢弃。 网络子系统如何丢弃数据包取决于实现,而不是在任何地方指定的。

总之,没有。 你不应该对在UDP套接字上收到的数据的顺序做任何假设,甚至在本地主机上。 它可能工作,它可能不会,也不能保证。

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

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

在windows上,你可以看看Named Pipes,它和Unix的名字有些不一样,但是正是用于这种进程间通信。

Loopback UDP在许多平台上都令人难以置信地不可靠,您可以轻松看到50%以上的数据丢失。 已经给出了各种各样的借口,说明有更好的运输机制可供使用。

现在有很多中间件堆栈可以使IPC更容易使用和跨平台。 看看像ZeroMQ或29 West的LBM ,它们使用相同的API进行进程内,进程间(IPC)和网络通信。

套接字接口可能无法控制数据的发起者,所以如果你有更高层次的流量控制,你可能会看到可靠的传输,但是总会有内存紧缩可能导致数据报丢失的可能性。

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