- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在制作一个程序,该程序创建一个 RAW 套接字以读取所有流量。在调用 socket() 和 recvfrom() 之间(最后一个在循环中以从缓冲区中取出所有数据包)我等待 5 秒。
当我运行该程序时,我使用 hping3 命令以“更快模式”(快速填充缓冲区)向我的程序发送了大约 200 个数据包。一旦 5 秒过去,我的程序就会从缓冲区中提取大约 150 个数据包。
我尝试更改接收缓冲区的大小以获得更好的结果:
int a = 65535;
if ( (setsockopt(sockfd, 0, SO_RCVBUF, &a ,sizeof(int)) ) < 0 )
{
fprintf(stderr, "Error setting sock opts..\n");
}
然而,无论 « a » 的值是 1 还是 10000000,它似乎都没有改变,我仍然从缓冲区中得到大约 150 个数据包。
有什么问题?
编辑:« a » 的值通过 getsockopt
调用进行验证。
最佳答案
如果操作系统似乎仍然无法正常工作,您也可能受到操作系统的限制。检查以下值:
/proc/sys/net/core/rmem_default
/proc/sys/net/core/rmem_max
如果它是您在示例中所说的 TCP,而不是实际的原始套接字,您还可以检查以下值:
/proc/sys/net/ipv4/tcp_mem
如果您对这些文件运行 cat,它们会显示当前设置。要永久更改它们,请使用 sysctl。最好在开始更改之前写下这些设置。这是有关进行这些更改的精彩教程:http://fasterdata.es.net/fasterdata/host-tuning/linux/ .
关于c - 为什么改变 SO_RCVBUF 的值不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10063497/
为了最小化延迟(我不关心数据包丢失),我想要尽可能小的 UDP 接收缓冲区。但是,当我将 SO_RCVBUF 设置为低于 1000(使用 setsockopt)时,我的程序从未收到任何数据包。我发送的
我有一个用 C++ 编写的小型 Android 应用程序,它打开一个到我的 HTTP 服务器的 TCP 套接字 (python -m SimpleHTTPServer) 并发送一个 header 。无
我正在制作一个程序,该程序创建一个 RAW 套接字以读取所有流量。在调用 socket() 和 recvfrom() 之间(最后一个在循环中以从缓冲区中取出所有数据包)我等待 5 秒。 当我运行该程序
快速提问,想知道是否有人知道 Windows 下 SO_RCVBUF 的限制是多少。 最佳答案 winsock 中的SO_RCVBUF 不受TCP 窗口大小的限制。至少对于 pre-Vista 堆栈。
你能解释一下 SO_SNDBUF 和 SO_RCVBUF 选项到底是什么吗? 好的,出于某种原因,操作系统会缓冲传出/传入数据,但我想澄清一下这个问题。 他们的角色(通常)是什么? 它们是每个套接
我有一个系统,当发生某些情况时,单字节消息会通过 UDP 套接字从一个进程发送到另一个进程。在接收端,这个事件发生一次、十几次甚至一百万次并不重要。 我想也许我可以使用setsockopt将SO_RC
我在 Linux 机器上有超过 300 万个文件描述符,所以我查看了套接字缓冲区大小与 RAM 大小的关系如何限制机器可以处理的最大同时 tcp 连接数。有没有类似经历的,请指教。谢谢。 最佳答案 这
我有一个在 Windows XP 上使用 TCP 的应用程序。当我使用 SO_RCVBUF 选项调用 getsockopt 时,它报告 8192 字节。但是,Wireshark 显示该应用程序通告 6
我接受一个带有默认值的 TCP 连接,我观察到 SYN、ACK 以 64K 的窗口大小和 7 的窗口比例因子发送。 在 3 次握手完成并为我的应用程序交换一些控制数据包后,我使用 setsockopt
在我的仅基于 LAN 的应用程序中,增加传输和接收缓冲区对性能有很大影响。 在 Linux 下,我可以将发送和接收缓冲区增加到 262142 字节。 是否可以在不更改内核的情况下绕过此限制?我正在使用
谁能快速解释一下 Netty/NIO 如何从操作系统消耗 TCP 缓冲区? 我认为 TCP 滑动窗口 ACK 由操作系统 TCP 堆栈(recvspace)管理,并在每个数据包(MTU 大小)之后发回
我需要读取最近传入的 UDP 数据包,无论读取之间是否丢失了数据包。传入数据包的速度比最大应用程序处理速度快 3 倍。为了实现这一目标,我使用 Java 的 DatagramSocket 类的 set
我在 C 程序中向 250 个节点发送 icmp 回显。套接字是这样创建的 sfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP); 我有 getsockopt S
我是一名优秀的程序员,十分优秀!