作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个从远程主机接收 UDP 数据的 C# 应用程序。我发现有时我的套接字没有收到任何东西,而且我似乎找不到任何线索来解释为什么!Wireshark 告诉我我的数据正在从远程设备正确发送。我似乎不明白为什么有时我可以收到罚款,有时我不能。
我没有得到任何异常,但是 OnRecieve 永远不会被调用
这是我的代码以防有帮助:
class cUdpRx
{
private Thread rxThread = null;
private Socket UdpSocket;
private IPEndPoint localEp;
byte[] byData;
//rxbytes event
public delegate void OnRxBytesEventHandler(byte[] rxBuf);
public event OnRxBytesEventHandler OnRxBytesEvent;
/// <summary>
/// Creates the udp socket
/// </summary>
/// <param name="Port"></param>
/// <returns></returns>
public bool CreateSocket(int Port)
{
try
{
byData = new byte[1500]; //create our buffer
UdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
UdpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
localEp = new IPEndPoint(IPAddress.Any,Port);
UdpSocket.Bind(localEp);
UdpSocket.BeginReceive(byData,0,byData.Length, SocketFlags.None, new AsyncCallback(OnRecieve), UdpSocket);
return true; //seemed to work ok
}
catch
{
Dispose();
return false; //something went wrong, abort
}
}
private void OnRecieve(IAsyncResult iar)
{
byte[] rxData;
int nBytesRec = 0;
Socket socket = (Socket)iar.AsyncState;
try //in case something else has already disposed of the socket
{
nBytesRec = socket.EndReceive(iar);
}
catch
{
Debug.WriteLine("cant access udp rx socket");
}
try
{
if (nBytesRec > 0)
{
rxData = new byte[nBytesRec];
Array.Copy(byData, rxData, nBytesRec); //copy exact data into new array
OnRxBytesEvent(rxData);
}
if(!killThreads)
UdpSocket.BeginReceive(byData, 0, byData.Length, SocketFlags.None, new AsyncCallback(OnRecieve), UdpSocket);
}
catch(SocketException se)
{
Debug.WriteLine(se.ToString());
}
}
任何帮助都将非常感激,因为它会阻止我继续我的项目。谢谢
更新似乎使用 IPAdress.any 是问题所在。如果我改变:
localEp = new IPEndPoint(IPAddress.Any,Port);
到
localEp = new IPEndPoint(IPAddress.Parse("192.168.0.33"),Port);
其中192.168.0.33是我电脑的IP地址,每次都会收到数据。谁能解释为什么?使用 IPAddress.any 并从无线和有线连接接收信息非常有用。IPAddress.any 相当于 0.0.0.0,根据 MSDN,它应该在所有网络接口(interface)上接收。
最佳答案
此类问题的常见原因是处理数据包的速度不够快。它们填满套接字接收缓冲区,内核开始丢弃它们。
增加 socket receive buffer size以适应流量突发。从快速套接字读取路径中删除所有非必要的内容。考虑下面的简单迭代方法而不是针对线程池工作:
rxData = new byte[nBytesRec];
while ( !time_to_stop ) {
int len = socket.Receive( rxData );
OnRxBytesEvent( rxData, len );
}
您的代码注释提到了多播。请注意,您需要添加显式 group membership为此,以及您在接口(interface)上加入多播组这一事实(显式或通过路由表决定),因此如果您想在两个接口(interface)上监听多播数据,则需要两个套接字。
关于c# - UDP有时收不到东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11792351/
我是一名优秀的程序员,十分优秀!