簡體   English   中英

在同一台機器上通過 UDP 套接字發送數據可靠嗎?

[英]Is sending data via UDP sockets on the same machine reliable?

如果我使用 UDP 套接字進行進程間通信,我是否可以期望其他進程以相同的順序接收所有發送數據?

我知道這通常不適用於 UDP。

不,我以前被這個咬過。 您可能想知道它怎么可能會失敗,但是您會遇到待處理數據包緩沖區填滿的問題,因此數據包將被丟棄。 網絡子系統如何丟棄數據包取決於實現,並沒有在任何地方指定。

簡而言之,沒有。 您不應該對 UDP 套接字上接收到的數據順序做出任何假設,即使是通過本地主機。 它可能有效,也可能無效,也不能保證。

不,即使使用本地套接字,也沒有這樣的保證。 如果您想要一種保證按順序交付的 IPC 機制,您可能會考慮使用帶有popen()的全雙工管道。 這將打開一個通向可以任意讀取或寫入的子進程的管道。 它將保證按順序交付,並可與同步或異步 I/O( select()poll() )一起使用,具體取決於您希望如何構建應用程序。

在 unix 上還有其他選項,例如 unix 域套接字或 System V 消息隊列(其中一些可能更快),但從管道讀取/寫入非常簡單且有效。 作為獎勵,測試您的服務器進程很容易,因為它只是從 Stdio 讀取和寫入。

在 Windows 上,您可以查看命名管道,它的工作方式與它們的 Unix 同名管道略有不同,但恰好用於此類進程間通信。

環回 UDP 在許多平台上非常不可靠,您可以輕松看到 50% 以上的數據丟失。 已經有各種借口可以使用更好的傳輸機制。

現在有許多可用的中間件堆棧使 IPC 更易於使用和跨平台。 看看像ZeroMQ29 West 的 LBM 之類的東西,它們使用相同的 API 進行進程內、進程間 (IPC) 和網絡通信。

套接字接口可能不會對數據的發起者進行流量控制,因此如果您有更高級別的流量控制,您可能會看到可靠的傳輸,但內存緊縮仍然有可能導致數據報丟失。

如果沒有流量控制限制數據報的內核內存分配,我想它會像網絡 UDP 一樣不可靠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM