UDP 是 IPC 的可靠协议吗?

2023-12-08

如果我纯粹使用 UDP 进行进程间通信(即在 1 个系统中,不涉及网络),我可以认为它可靠吗?或者我还需要担心数据包丢失等问题吗?

Note这是一个实际的问题,而不是理论问题。如果不同操作系统的答案有所不同,请解释具体情况,特别是包括 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 数据包,程序 B 接收并记录它们。 (在 UDP 数据包中包含序列号,以便程序 B 可以轻松判断何时未收到数据包)。

一旦工作正常并且数据包以适当的速率传输,将一些代码放入程序 B 中,以便它经常调用 sleep(5) (或类似的方法,以便程序 B 无法在其 UDP 套接字上调用 recv()大量的时间)。您可能会看到,在 sleep() 调用返回后,程序 B 报告跳过了一些数据包 - 因为当 B 处于睡眠状态时,其 UDP 套接字的传入数据包缓冲区已满,然后网络丢弃了一些数据包堆起来,因为没有地方放它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UDP 是 IPC 的可靠协议吗? 的相关文章

  • 选择时的套接字阻塞和超时

    我目前正在创建一个回显服务器 该服务器在空闲 maxWaitTime 后断开客户端连接 我希望程序会阻塞套接字 直到客户端发送数据 但是当我在 gdb 中运行该程序时 它会通过 select 并阻塞 Readline 我知道 retval
  • 在本地主机上使用相同的 IP 和端口创建套接字

    我在 Linux 上看到奇怪的行为 我看到远程端和本地端都显示相同的 IP 和端口组合 以下是 netstat 输出 netstat anp 网络统计grep 6102 tcp 0 0 139 185 44 123 61020 0 0 0
  • boost 是否有可移植的方式来使用 ntohl/htonl/ntohs/htons 类型函数?

    我正在使用 UDP 特别是 boost asio ip udp socket 套接字 如果有帮助的话 头文件是什么 我需要哪些标头 类来处理 UDP 提升下的网络字节排序 刚刚发现就足够了 include
  • 如何从任何进程关闭 Windows 上的套接字(ipv4 和 ipv6)连接?

    如何在 Windows 上关闭 tcp v4 和 tcp v6 连接 我不想终止具有开放连接的整个进程 因为这显然会将其他人踢出该进程 我需要从一个单独的进程执行此操作 因此无法访问套接字句柄等 我正在使用 Windows API 来获取
  • 使用套接字和 AsyncTask 强制关闭

    堆栈的人们大家好 请参阅下面我的班级代码和我的 LogCat 尝试连接时我受到强力关闭 如果有人能帮助我找出原因 我将不胜感激 基本上代码的作用是 从意图中获取 IP 地址 连接到端口 32 的 IP 然后发送一个命令 等待响应并发送另一个
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • RTSP 设置后接收 RTP 数据包

    我正在尝试使用 Python 从 IP 摄像机流式传输 RTP 数据包 我能够使用 RTSP 协议发送描述 设置和播放命令 但是 我无法开始使用 RTP 传输实际视频流 这是代码 import socket def printrec rec
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • 如何使用 select 将数据从服务器发送到客户端

    我在一些教程的帮助下想出了一个代码 用于使用选择功能与客户端连接并接受来自客户端的消息 现在我想做的是在服务器需要时将数据发送到特定的客户端 如何做到这一点 提前致谢 服务器代码 include
  • 最好的 Flash 音频/视频 + 交互服务器?

    我正在寻找有关 Flash 实时服务器的建议 目前 我们使用 Moock 的组合Unity http www moock org unity and Red5 http osflash org red5 但有几个问题 首先 我们正在转向 A
  • 在 NodeJS 中将子进程的输出保存在父进程的变量中

    我想在 NodeJS 中启动一个子进程并将其输出保存到一个变量中 以下代码将其提供给标准输出 require child process execSync echo Hello World stdio inherit 我的想法与此代码类似
  • Node.js、Socket.io:如何获取客户端浏览器语言?

    我正在尝试使用 socket io 和 node js 获取用户使用的语言 以便为播放视频提供正确的声音文件 我是node js 和socket io 的初学者 我通过 navigator language 在客户端获取了语言 并希望在连接
  • 如何在 PHP 客户端和 C 守护程序服务器之间进行 IPC?

    感谢您查看这个问题 的背景我有几台机器可以在很短的时间内连续生成多个 最多 300 个 PHP 控制台脚本 这些脚本运行速度很快 不到一秒 然后退出 所有这些脚本都需要对大型文件进行只读访问trie http en wikipedia or
  • IPC:在两个程序之间使用 C++ 中的命名管道

    我试图在同一台机器上运行的两个不同程序之间实现IPC 在我的例子中是CentOS7 为了实现一种松散耦合 我决定对 IPC 使用命名管道 因此 我正在使用以下示例并遇到了不同的问题 创建并写入管道 include
  • 在 Python 3 中使用 Socket 时出现 400 Bad Request 错误

    我刚刚开始使用 Python 3 6 1 中的 Python Web 数据 我正在学习套接字 我的代码有一个问题 我无法弄清楚 我的代码中的网站工作正常 但是当我运行此代码时 我收到 400 Bad Request 错误 我不太确定我的代码
  • 何时调用setsockopt?在bind()和connect()之前?

    我继承了一些 TCP 代码 调用 bind tcpSocket struct sockaddr server addr sizeof server addr 在致电之前 setsockopt tcpSocket SOL SOCKET SO
  • 处理异步时 TcpClient 与 Socket

    这不是另一个 TcpClient 与 Socket 的较量 TcpClient 是 Socket 类的包装器 以简化开发 同时还公开了底层 Socket 仍然 在 TcpClient 类的 MSDN 库页面上 可以读到以下注释 TcpCli
  • 用于进程间共享内存的非 Boost STL 分配器?

    由于我工作地点的政策 我无法使用高于 1 33 1 的 Boost 版本 也无法使用高于 4 1 2 的 GCC 版本 是的 它是垃圾 但我对此无能为力 Boost 1 33 1 不包含进程间库 也就是说 我的一个项目需要放置一个std m
  • WinSock.h 和 WinSock2.h 使用哪个?

    有谁知道 WinSock h 和 WinSock2 h 之间的区别 我知道它们不使用相同的库 lib 但我不知道 WinSock2 是否仅添加了新功能 或者是否还改进了 WinSock 1 功能 我正在使用 IP TCP 套接字 并希望使用
  • Microsoft SQL 数据库的 WebSocket 侦听器

    我目前正在开发一个项目 该项目必须使用 WebSockets 作为将数据传输到客户端的方式 基础设施看起来像这样 客户端 gt Web 服务器 gt Microsoft SQL 数据库 我想最理想的情况应该是这样的 客户端打开一个到服务器的

随机推荐