簡體   English   中英

UDP是IPC的可靠協議嗎?

[英]Is UDP a reliable protocol for IPC?

如果我純粹使用UDP進行進程間通信(即,在1個系統中, 不涉及網絡 ),我可以認為它是可靠的嗎? 或者我仍然需要擔心丟包等問題?

請注意 ,這是一個實際問題,而不是理論問題。 如果操作系統的答案不同,請解釋如何,特別是包括Windows,Linux和Mac。


編輯:不,這不可靠 - 例如下面。

感謝目前的答案,指出我正確的方向。
此代碼在Windows 8.1上丟棄一個數據包(我Received: 18432 (DROPPED PACKET) )。
(我不確定它為什么不在Linux上運行,但它應該接近工作。)

#include <stdio.h>
#ifdef _WIN32
#include <ws2tcpip.h>
#else
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#endif

int main()
{
#ifdef _WIN32
    typedef int socklen_t;
#else
    typedef int SOCKET;
#endif
    SOCKET r = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in addr = { AF_INET };
    addr.sin_addr.s_addr = htonl(0x7F000001);
    {
        socklen_t addrlen = sizeof(addr);
        if (bind(r, (struct sockaddr *)(&addr), addrlen) == -1 ||
            getsockname(r, (struct sockaddr *)(&addr), &addrlen) == -1)
        {
            return 1;
        }
    }
    SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
    int tids = 0;
    for (long c = 0, i = 0, j = 0; c < 1000000; ++c)
    {
        if ((c + 1) % 10)
        {
            int n = sendto(s, (char const *)(&i), sizeof(i), 0, (struct sockaddr const *)(&addr), sizeof(addr));
            if (n != sizeof(i)) { return 1; }
            // else { fprintf(stderr, "Sent:     %lu\n", i); }
            ++i;
        }
        else
        {
            struct sockaddr temp;
            socklen_t templen = sizeof(temp);
            long v;
            int n = recvfrom(r, (char *)(&v), sizeof(v), 0, (struct sockaddr *)(&temp), &templen);
            if (n != sizeof(v)) { return 2; }
            else if (v != j) { fprintf(stderr, "Received: %lu (DROPPED PACKET)\n", v); return 3; }
            // else { fprintf(stderr, "Received: %lu\n", v); }
            ++j;
        }
    }
}

如果我純粹使用UDP進行進程間通信(即,在1個系統中,不涉及網絡),我可以認為它是可靠的嗎?

不可以。即使在同一主機上進行所有通信,UDP數據包仍然可以(有時會)丟棄。

如果你願意,你可以自己演示這個; 在同一主機上設置兩個使用UDP套接字的程序,程序A向程序B發送UDP數據包,接收它們並記錄它們。 (在UDP數據包中包含序列號,以便程序B可以輕松判斷何時未收到數據包)。

一旦它工作並且數據包以合適的速率傳輸,將一些代碼放入程序B,以便每隔一段時間調用sleep(5)(或類似的,以便程序B無法在其UDP套接字上調用recv()很長一段時間)。 您可能會看到,在sleep()調用返回后,程序B報告某些數據包被跳過 - 因為當B處於睡眠狀態時,其UDP套接字的傳入數據包緩沖區已滿,然后網絡中的某些數據包被丟棄堆疊,因為沒有地方放他們。

暫無
暫無

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

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