当前位置: 首页 > 知识库问答 >
问题:

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

哈骞仕
2023-03-14

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

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

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

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

来自所有客户端的UDP反馈/确认具有大小为20字节的固定有效载荷。

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

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

我尝试使用函数调用< code>getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)来获取我的套接字(< code>fdsocket)的Linux套接字缓冲区大小

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

以下是我在提出这个问题之前提到的链接。

  1. Linux网络
  2. UDP SentTo和Recvfrom最大缓冲区大小
  3. UDP套接字缓冲区溢出检测
  4. UDP广播和单播通过同一套接字
  5. 在多个线程中从同一UDP套接字发送
  6. 如何在C中刷新UDP套接字的输入缓冲区
  7. 如何找到linux的套接字缓冲区大小
  8. 如何获取UDP套接字的排队数据量

共有3个答案

爱刚捷
2023-03-14

问:对多个客户端使用同一个套接字发送/接收UDP数据正确吗?

答:是的,这是正确的。

问:如何找到最大数量的UDP反馈/确认数据包我的应用程序可以处理没有UDP套接字缓冲区溢出(因为我每4秒读取一次,如果我在这4秒内收到很多数据包,我可能会丢失一些数据包,即。,我需要找到的速率:我可以安全处理的noof分组/秒)?

A: 瓶颈可能是网络带宽、CPU或内存。您可以简单地进行测试,使用一个向服务器发送ACK并带有连续编号的客户端,并验证服务器上是否存在数据包丢失。

钮边浩
2023-03-14

您可以看到允许的最大缓冲区大小:

sysctl net.core.rmem_max

您可以通过以下方式设置可以使用的最大缓冲区大小:

sysctl -w net.core.rmem_max=8388608

您还可以使用 setsockopt 和更改SO_RCVBUF在运行时设置缓冲区大小(不超过上述最大值)。您可以通过查看 /proc/net/udp 来查看缓冲区级别。

缓冲区用于存储UDP标头和应用程序数据,其余属于较低级别。

张光辉
2023-03-14

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

另一方面,由于您已经在使用线程,因此您可以只执行阻塞 recv(2) 而不进行四秒睡眠。

阅读Stevens关于< code>SO_RCVBUF的解释。

 类似资料:
  • 缓冲区溢出的漏洞随着冯·诺依曼 1 构架的出 现就已经开始出现了。 在1988年随着莫里斯互联网蠕虫的广泛传播他们开始声名狼藉。不幸的是, 同样的这种攻击一直持续到今天。 到目前为止,大部分的缓冲区溢出的攻击都是基于摧毁栈的方式。 大部分现代计算机系统使用栈来给进程传递参数并且存储局部变量。 栈是一种在进程映象内存的高地址内的后进先出(LIFO)的缓冲区。 当程序调用一个函数时一个新的“栈帧”会被

  • 问题内容: 假设我想使用标准模块从套接字读取一行: 到底发生了什么?每次都会发出系统调用吗?我想无论如何我应该添加一些缓冲: 为了与硬件和网络实际情况达到最佳匹配, bufsize 的值应为2的相对较小的幂,例如4096。 http://docs.python.org/library/socket.html#socket.socket.recv 但是编写高效且线程安全的缓冲似乎并不容易。如果我使用

  • 当程序试图在临时数据存储区域(缓冲区)中存储比预期要容纳的更多数据时,会出现缓冲区溢出。由于创建缓冲区以包含有限数量的数据,因此额外信息可能溢出到相邻缓冲区中,从而破坏其中保存的有效数据。 示例 这是缓冲区溢出的经典示例。它演示了一个简单的缓冲区溢出,它是由第一个依赖外部数据来控制其行为的场景引起的。无法限制用户输入的数据量,程序的行为取决于用户放入的字符数。 动手实践 第1步 - 我们需要使用姓

  • 我已经在Minikube上部署了一个UDP套接字服务器。套接字服务绑定到端口2152。下面是description pod命令中的IP片段。 我的客户机与minikube运行在同一个VM上,无法与服务器通信。我在客户端使用服务器地址IP 172.17.0.3,端口为2152。我还尝试使用minikube IP 192.168.49.2将UDP数据从客户端发送到服务器。 请帮忙,这里有什么问题。

  • 我是 python 和套接字的新手,正在尝试编写一个回显客户端/服务器套接字。我已经编写了服务器,以便丢失 30% 的数据包。我将客户端编程为在一秒后超时,因为数据包可能会丢失。但是,每当我运行客户端套接字时,我的输出都是 100% 请求超时。我假设我得到这个输出,因为我的服务器从未收到过消息。我已经多次查看了我的代码,但无法弄清楚为什么我不断获得此输出。下面是我的服务器和客户端套接字的代码。任何

  • 我正在制作一个应用程序,将发送1MB长度的数据。Bellow是我的测试代码,它只是发送一个1MB的简单字节数组,然而,即使当我尝试将发送缓冲区增加到1MB或更高时,它也不断抛出Bellow异常。 system.net.sockets.socketexception未处理errorcode=10040 hresult=-2147467259 message=数据报套接字上发送的消息大于内部消息缓冲区