gpt4 book ai didi

c++ - UDP 服务器套接字缓冲区溢出

转载 作者:IT王子 更新时间:2023-10-29 01:12:12 28 4
gpt4 key购买 nike

我正在 Linux 上编写 C++ 应用程序。我的应用程序有一个 UDP 服务器,它在某些事件上向客户端发送数据。 UDP 服务器还接收来自客户端的一些反馈/确认。

为了实现这个应用程序,我使用了一个 UDP 套接字(例如 int fdSocket)来发送和接收来自所有客户端的数据。我将这个 socked 绑定(bind)到端口 8080 并将套接字设置为 NON_BLOCKING 模式。

我创建了两个线程。在一个线程中,我等待某个事件发生,如果事件发生,则我使用 fdsocket 将数据发送到所有客户端(在 for 循环中)。

在另一个线程中,我使用 fdSocket 从客户端接收数据 (recvfrom())。该线程计划每 4 秒运行一次(即每 4 秒调用一次 recvfrom() 以从套接字缓冲区检索数据。由于它处于 NON-BLOCKING 模式,因此 recvfrom( ) 如果没有可用的 UDP 数据,函数将立即返回,然后我将休眠 4 秒)。

来自所有客户端的 UDP 反馈/确认有一个固定的负载,其大小为 20 字节。

现在我有两个与此实现相关的问题:

  1. 使用同一个套接字发送/接收UDP数据是否正确有多个客户?
  2. 如何找到我的应用程序在没有 UDP 套接字缓冲区溢出的情况下可以处理的 UDP 反馈/确认数据包的最大数量(因为我每 4 秒读取一次,如果我在这 4 秒内收到大量数据包,我可能会丢失一些数据包,即,我需要找到我可以安全处理的数据包/秒速率)?

我尝试使用函数调用 getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);。从这个函数我发现我的套接字缓冲区大小是 110592。但是我不清楚这个套接字缓冲区中将存储什么数据:它会只存储 UDP 有效负载或整个 UDP 数据包还是事件整个以太网数据包?我提到了这个link得到一些想法,但感到困惑。

目前我的代码有点脏,我会尽快清理并在这里发布。

以下是我在发布此问题之前引用的链接。

  1. Linux Networking
  2. UDP SentTo and Recvfrom Max Buffer Size
  3. UDP Socket Buffer Overflow Detection
  4. UDP broadcast and unicast through the same socket?
  5. Sending from the same UDP socket in multiple threads
  6. How to flush Input Buffer of an UDP Socket in C?
  7. How to find the socket buffer size of linux
  8. How do I get amount of queued data for UDP socket?

最佳答案

以固定的四秒间隔读取套接字肯定会让您丢失数据包。非阻塞 I/O 的传统可靠方法是解复用器系统调用 select(2)/poll(2)/epoll(7) .看看您是否可以使用这些来捕获/响应您的其他事件。

另一方面,由于您已经在使用线程,您可以只阻塞 recv(2)没有那四秒钟的 sleep 。

阅读Stevens SO_RCVBUF 的解释。

关于c++ - UDP 服务器套接字缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11451093/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com