如果我仅在一个系统中(即没有网络涉及)使用UDP进行进程间通信,我可以认为它是可靠的吗?还是我仍然需要担心数据包丢失等问题?请注意,这是一个实际问题,而非理论问题。如果答案在不同的操作系统中有所不同,请说明原因,尤其是包括Windows、Linux和Mac。
编辑:不,它不可靠——以下是一个例子。感谢当前答案指引我正确方向。这段代码在Windows 8.1上会丢失一个数据包(我收到了"Received: 18432 (DROPPED PACKET)")。(我不确定为什么它不能在Linux上运行,但应该接近运行状态。)
编辑:不,它不可靠——以下是一个例子。感谢当前答案指引我正确方向。这段代码在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;
}
}
}