【问题标题】:Why udp sendto become so slow when the input data size increase a little?为什么当输入数据大小增加一点时 udp sendto 会变得如此缓慢?
【发布时间】:2012-07-21 14:49:39
【问题描述】:

我有一个奇怪的问题。 我在android上做了以下测试:

我=0;
而(i {

//UDP发送数据包
if( sendto(sockfd,buffer,strlen(buffer),0, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) {
error("无法通过 udp 向远程主机发送数据包\n");
}
我++;
}

我用不同的缓冲区大小做了这个测试。当缓冲区大小小于一个数字时(应该在 500bytes 左右),无论我选择哪种大小,比如 20 40 80 160 320 ,while 语句可以在几乎相同的时间内执行,例如 3 分 10 秒。但是,当数据包大小大于 500 时,例如 510 520 600 1280,while 语句的执行时间要长得多,例如超过 10 分钟。谁能给我一些关于原因的提示?

【问题讨论】:

  • 你要发送多少个数据报?
  • 你的意思是数据报套接字?只有一个
  • 我的意思是datagrams,即你所说的“数据包”。
  • 一个数据包是一个缓冲区,大小应该是20 40 80 160

标签: udp packet processing-efficiency sendto


【解决方案1】:

事实上,这个问题很可能是由 strlen() 引起的,它会在 while() 循环的每次迭代中尝试在缓冲区中查找 /0 字符!

用变量代替,执行速度会提高。

另一个可能的原因是数据包碎片。

【讨论】:

  • 特别是如果缓冲区是二进制数据。如果它不包含\0,那么 strlen 将运行大量内存来寻找一个,可能会发送未知大尺寸的数据包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2015-11-21
  • 2021-08-26
  • 1970-01-01
  • 2017-06-15
  • 2023-03-12
相关资源
最近更新 更多