向一块网卡发包速度太快出现错误

发布于 2022-10-15 06:02:33 字数 1487 浏览 20 评论 0

环境如下:
FreeBSD XXX 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Fri Feb 18 02:24:46 UTC 2011     :/usr/obj/usr/src/sys/GENERIC  i386

使用sendto向一个目标ip发送包,主要代码如下:

  1. while (numtries-- > 0)
  2.     {
  3.         if (sendto
  4.                 (s, datagram, iph->ip_len, 0, (struct sockaddr *) &servaddr,
  5.                  sizeof (servaddr)) < 0)
  6.         {
  7.             fprintf (stderr, "Error in sendto:%s\n", strerror(errno));
  8.             exit (1);
  9.         }
  10.         else
  11.         {
  12.             /*usleep(30);*/
  13.            
  14.    }

复制代码注释掉usleep(30)则发送1000个包以上时,会出现如下错误:

  1. Error in sendto:No buffer space available

复制代码加上usleep(30)后,就可以正常发包了。

但是我又要保证很高的发送速度,所以不能睡眠。

同一个代码文件,同样的系统和环境,但网卡不同,我在虚拟机上跑的时候,加不加睡眠函数都没有影响,都能正常发包。

请问这个问题该如何解决呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

诗酒趁年少 2022-10-22 06:02:33

通过sysctl 加大socket的buffer

围归者 2022-10-22 06:02:33

通过sysctl 加大socket的buffer
garibaldi2 发表于 2011-05-30 17:30

    加大socket的buffer也不行,这样发总会填满;正确的方式应该是判断sendto返回时errno,如果出现buffer已满则sleep、重试。

忘东忘西忘不掉你 2022-10-22 06:02:33

一般正常的发包会有回包吧。除非不正常应用。

所以一般的做法是做个队列。等到回包后再淘汰

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文