我正在做一些基本的 Socket 消息传递。我有一个运行良好的例程,但在负载下存在问题。
我正在使用 UDP 来执行无连接的 SendTo,以基本上执行类似 ping 的操作,以查看我的任何侦听器是否在 LAN 上。理想情况下,我只使用广播地址,但无线路由器似乎没有中继我的广播。我的工作是遍历子网上的所有 IP 并将我的数据报发送到每个 IP。其他 PC 正在监听,如果他们收到消息,他们会回复,这就是我让 Peers 找到彼此的方式。这是循环中的代码,它将数据报发送到子网中的每个 IP。
string msgStr = "some message here...";
byte[] sendbuf = Encoding.ASCII.GetBytes(msgStr);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Blocking = true;
socket.SendTo(sendbuf, remoteEndPt);
//socket.Close();
这可行,但是当子网范围很大时,比如 255.255.0.0(意味着要迭代约 60,000 个 IP),我最终会得到一个带有错误代码“10022”的 SocketException,意思是“无效参数”。这往往发生在大约 10,000 次成功发送之后,然后我开始看到这个错误。此外,我在工作中使用的路由器可以处理它,并且可能是一个高功率路由器,但我实验室中的廉价路由器是产生错误的路由器。
如果我在捕获 SocketException 之后并在恢复循环之前放入等待时间,它通常会恢复,但最终我会再次收到错误。
我认为正在发生的事情是路由器上的缓冲区已满,我无法再发送数据。工作中质量较高的人可以处理它,但便宜的人会陷入困境。这听起来合理吗?
几个问题:
1) 当以无连接方式使用 SendTo 时,我需要在我的 Socket 上调用 Close() 吗?
我没有看到调用 Close() 有什么好处,但是当我调用 Close() 时,它会严重减慢我的迭代速度(我在上面注释掉了它,因为它确实减慢了很多速度)。这有意义吗?
2) 有没有办法告诉我在尝试发送更多数据之前应该等待?仅仅捕获异常似乎是不对的,我仍然不知道它的原因是什么。
谢谢,J。