当前位置: 首页 > 面试题库 >

在Linux中在运行时指定UDP接收缓冲区大小

裴鸿熙
2023-03-14
问题内容

在Linux中,可以使用以下命令为网络数据包(例如UDP)指定系统的默认接收缓冲区大小:

sysctl -w net.core.rmem_max=<value>
sysctl -w net.core.rmem_default=<value>

但我想知道,应用程序(例如in中c)是否可以通过在运行时指定每个UDP套接字的接收缓冲区大小来覆盖系统的默认值?


问题答案:

您可以从默认值增加该值,但不能将其增加到最大值以上。使用setsockopt更改SO_RCVBUF选项:

int n = 1024 * 1024;
if (setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1) {
  // deal with failure, or ignore if you can live with the default size
}

请注意,这是便携式解决方案。它可以在任何POSIX平台上工作,以增加接收缓冲区的大小。Linux已经进行了一段时间的自动调整(自2.6.7版本开始,并且自2.6.17版本以来具有合理的最大缓冲区大小),它会根据负载自动调整接收缓冲区的大小。在具有自动调整功能的内核上,建议您不要使用设置接收缓冲区的大小setsockopt,因为这将禁用内核的自动调整功能。setsockopt但是,在其他平台上,仍然可能需要使用调整缓冲区大小。



 类似资料:
  • 本文向大家介绍在Python中打开文件时如何指定缓冲区大小?,包括了在Python中打开文件时如何指定缓冲区大小?的使用技巧和注意事项,需要的朋友参考一下 如果看一下open-open(name [,mode [,buffering]])的函数定义,您会发现在Python 2中它需要3个参数,第三个是缓冲。可选的buffering参数指定文件所需的缓冲区大小:0表示未缓冲,1表示行缓冲,任何其他正

  • 问题内容: 我有一个内存泄漏,我已经将其隔离到错误配置的直接字节缓冲区。 GC收集包含这些缓冲区但不处理缓冲区本身的对象。如果实例化包含缓冲区的瞬态对象足够多,则会得到以下令人鼓舞的消息: 我一直在寻找这个问题,显然 和 不工作。 问题答案: 我怀疑您的应用程序某处有对ByteBuffer实例的引用,这阻止了它被垃圾回收。 直接ByteBuffer的缓冲内存是在普通堆之外分​​配的(以便GC不会移

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

  • 问题内容: Linux的默认套接字缓冲区大小是多少?有什么命令可以看到吗? 问题答案: 如果要在终端中查看缓冲区大小,可以看一下: (供阅读) (写) 它们包含三个数字,分别是最小,默认和最大内存大小值(以字节为单位)。

  • 我正在Linux上编写一个C应用程序。我的应用程序有一个 UDP 服务器,它在某些事件上向客户端发送数据。UDP 服务器还会收到来自客户端的一些反馈/确认。 为了实现这个应用程序,我使用了一个UDP套接字(例如< code>int fdSocket)来发送和接收来自所有客户端的数据。我将这个socked绑定到端口8080,并将套接字设置为非阻塞模式。 我创建了两个线程。在一个线程中,我等待某个事件

  • 问题内容: 对我而言,尚不清楚两个Linux内存概念和之间有什么区别。 缓冲区的策略是先进先出 缓存的策略是“最近最少使用”。 我对吗? 特别是,我正在查看两个命令:和 问题答案: “缓冲区”表示RAM的多少部分专用于缓存磁盘块。“缓存”类似于“缓冲区”,只是这次它缓存文件读取中的页面。 引用自: https://web.archive.org/web/20110207101856/http://