Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从Node.js UDP发送大量小数据包不';I don’我不能把他们都送去_Javascript_Node.js_Sockets_Networking_Udp - Fatal编程技术网

Javascript 从Node.js UDP发送大量小数据包不';I don’我不能把他们都送去

Javascript 从Node.js UDP发送大量小数据包不';I don’我不能把他们都送去,javascript,node.js,sockets,networking,udp,Javascript,Node.js,Sockets,Networking,Udp,我有一个项目,我正在工作,需要发送一个小的9字节的数据包到7000个不同的主机以外的本地网络,然后它等待他们的回复回到同一个端口,并处理响应 我遇到的问题是Node.js dgram(udp4)似乎没有发送所有数据包。我没有以任何方式限制利率,因此可能存在问题 我正在循环,创建数据包,然后使用.send()直接触发它们。当Wireshark打开时,我可以看到在7000个被“发送”的人中,只有约1300个似乎撞到了电线并离开了 脚本本身报告所有数据包已发送,没有错误,Wireshark显示不同的结

我有一个项目,我正在工作,需要发送一个小的9字节的数据包到7000个不同的主机以外的本地网络,然后它等待他们的回复回到同一个端口,并处理响应

我遇到的问题是Node.js dgram(udp4)似乎没有发送所有数据包。我没有以任何方式限制利率,因此可能存在问题

我正在循环,创建数据包,然后使用.send()直接触发它们。当Wireshark打开时,我可以看到在7000个被“发送”的人中,只有约1300个似乎撞到了电线并离开了

脚本本身报告所有数据包已发送,没有错误,Wireshark显示不同的结果,另一端的主机反映Wireshark所说的,他们没有收到数据包。我使用下面的代码来发送和验证,数据包是一个缓冲区

udpServer.send(packet, 0, packet.length, port, address, function(error) {
  if (!error) {
    successes++;
    console.log(successes + "/" + total);
  } else {
    console.log(error);
  }
});

关于我在这里做错了什么,或者忽略了什么,你有什么想法吗?

在很多情况下,你的数据包可能会被丢弃:

  • 发送到内核时已删除。你在linux上吗?尝试使用strace查找系统调用(可能是send、sendmsg或sendto)返回值。如果系统调用返回错误,我希望节点在“error”中报告

  • 已在内核发送队列中丢弃。在linux上,您可以检查,例如,
    /sys/class/net/eth0/statistics/
    ,并查看是否有丢弃计数器在递增

  • 硬件发送队列中已丢弃。如果使用Intel NIC,您可以运行
    ethtool-S eth0
    ,查看是否有丢弃计数器递增

  • 插入中间硬件(如交换机/路由器)。这一点更难理解,因为它依赖于供应商,可能不可见。您可以通过将机器直接相互连接来消除这种情况

  • 硬件接收队列中已丢弃。在远程端,检查所有相同的统计信息,查看是否有溢出发生


  • 您的数据包可能会在许多关口被丢弃:

  • 发送到内核时已删除。你在linux上吗?尝试使用strace查找系统调用(可能是send、sendmsg或sendto)返回值。如果系统调用返回错误,我希望节点在“error”中报告

  • 已在内核发送队列中丢弃。在linux上,您可以检查,例如,
    /sys/class/net/eth0/statistics/
    ,并查看是否有丢弃计数器在递增

  • 硬件发送队列中已丢弃。如果使用Intel NIC,您可以运行
    ethtool-S eth0
    ,查看是否有丢弃计数器递增

  • 插入中间硬件(如交换机/路由器)。这一点更难理解,因为它依赖于供应商,可能不可见。您可以通过将机器直接相互连接来消除这种情况

  • 硬件接收队列中已丢弃。在远程端,检查所有相同的统计信息,查看是否有溢出发生


  • 我想它丢失了其余的数据包,也许你可以在这里找到一个解决方案:@C0dekid.php我已经看过了。这似乎主要围绕着接收端而不是发送端。除了在Unix上运行之外,它也没有任何建议。我尝试过不同的平台,结果都是一样的。谢谢你的链接,不幸的是还没有修复。有趣的一个。您是否尝试过发送普通字符串而不是缓冲区,以确保这不是问题所在?(不应该是这样,只是以防万一)我在chromium window中遇到了类似的情况。OnForeUnload之前,我需要在循环中向客户端发送一些udp,以通知关闭的客户端数量。使用在应用程序启动时创建的共享套接字发送命令非常不可靠。回调函数从未被命中,没有抛出错误。似乎套接字从未将数据从其内部缓冲区刷新到网络。我尝试了几种方法,比如延迟和计数器等待来自循环的每次回调。什么都没用。最后,我需要为每个循环迭代和发送创建一个新套接字。这使它起了作用。非常奇怪…我想它丢失了其余的数据包,也许你可以在这里找到解决方案:@C0dekid.php我已经看过了。这似乎主要围绕着接收端而不是发送端。除了在Unix上运行之外,它也没有任何建议。我尝试过不同的平台,结果都是一样的。谢谢你的链接,不幸的是还没有修复。有趣的一个。您是否尝试过发送普通字符串而不是缓冲区,以确保这不是问题所在?(不应该是这样,只是以防万一)我在chromium window中遇到了类似的情况。OnForeUnload之前,我需要在循环中向客户端发送一些udp,以通知关闭的客户端数量。使用在应用程序启动时创建的共享套接字发送命令非常不可靠。回调函数从未被命中,没有抛出错误。似乎套接字从未将数据从其内部缓冲区刷新到网络。我尝试了几种方法,比如延迟和计数器等待来自循环的每次回调。什么都没用。最后,我需要为每个循环迭代和发送创建一个新套接字。这使它起了作用。很奇怪…谢谢这个答案,很多优秀的点子要考虑。我看了第1、2和3项,没有一项显示出任何问题的迹象。除此之外,我没有看其他内容,因为Wireshark没有显示这些数据包已经离开,所以在机器之外进行检查是没有意义的?不幸的是,我还没有解决这个问题。不过,我真的很感谢您的回复。还有一个损失层,您计算过node产生的系统调用了吗?它是否与您期望它发送的内容匹配?可能节点正在放弃或溢出某些内部数据结构。所有sendmsg都已计算在内。在我刚刚做的测试中,我看到了7558的日志记录,strace报告了7558,但Wireshark只看到了其中的1267个。长期延迟的响应,但可能会在