gpt4 book ai didi

c# - 循环中的C#Socket.SendTo最终会导致SocketException(取决于路由器)

转载 作者:行者123 更新时间:2023-12-03 12:01:30 26 4
gpt4 key购买 nike

我正在做一些基本的套接字消息传递。我有一个运行良好的例程,但是在负载下存在问题。

我正在使用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),我最终将获得一个SocketException,错误代码为“10022”,意味着“Invalid Argument”。在大约10,000个成功发送之后,这种情况往往会发生,然后我开始看到此错误。另外,我在工作中使用的路由器可以处理它,并且大概是高功率路由器,但是在我的实验室中,cheap-o路由器会产生错误。

如果我在捕获SocketException之后并在恢复循环之前花了一个等待时间,它将通常恢复,但是最终我会再次得到该错误。

我认为正在发生的事情是路由器上的缓冲区已满,我无法再发送数据了。工作中质量较高的人可以应付,但价格便宜的人会陷入困境。听起来合理吗?

几个问题:

1)以无连接方式使用SendTo时,是否需要在Socket上调用Close()?

在调用Close()时,我还没有看到任何好处,但是当我调用Close()时,它会严重减慢我的迭代速度(我在上面已经注释掉了,因为它确实使速度变慢了很多)。这有意义吗?

2)有没有办法告诉我在发送更多数据之前应该等待?仅捕获Exception似乎是不正确的,但我仍然不知道是什么原因造成的。

谢谢,J。

最佳答案

我不确定这仅是路由器,但我怀疑您在操作系统中也遇到了一些限制...

有什么理由每次发送时都要创建Socket吗?
只是重复使用它...

无论如何,根据http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx,最好先调用Shutdown(),然后再在Close()上调用Socket……也许不是每次发送,而是每255个IP左右……

Checkout UdpClient -可以使实现更容易/更可靠

编辑-根据评论:

如果您想要套接字重用“缓存” ...例如,这将确保仅每256次检查才使用特定的套接字...

// build/fill your Socket-Queue for example in the con
class SocketExample
{
Queue<Socket> a = new Queue<Socket>();
SocketExample ()
{
int ii = 0, C = 256;
for (ii = 0; ii < C; C++)
{
a.Enqueue (new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp));
}
}

// in your function you just dequeue a Socket and use it,
// after you are finished you enqueue it
void CheckNetIP (some parameters...)
{
Socket S = a.Dequeue();
// do whatever you want to do...
// IF there is no exception
a.Enqueue(S);
}
}

关于c# - 循环中的C#Socket.SendTo最终会导致SocketException(取决于路由器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7048038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com