作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一些基本的套接字消息传递。我有一个运行良好的例程,但是在负载下存在问题。
我正在使用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();
最佳答案
我不确定这仅是路由器,但我怀疑您在操作系统中也遇到了一些限制...
有什么理由每次发送时都要创建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/
我是一名优秀的程序员,十分优秀!