c# - 在 Windows Phone 7 中异步接收 UDP 单播数据包的问题

标签 c# sockets windows-phone-7 asynchronous udp

我正在尝试让我的 Windows Phone 7 Mango 应用程序监听传入的 UDP 数据包,但遇到了麻烦。我安装了 Windows Phone 7.1 SDK 和开发工具的新 Beta 2 更新版。我尝试与此 MSDN sample 的任何偏差导致 SocketException 10022,“提供了无效参数”。

我的代码粘贴在下面。我一直在尝试调整我在 this stackoverflow post 上找到的代码但无济于事。此行在到达时生成异常:

synchronous = m_udpSock.ReceiveFromAsync(udpRecvArg);

我希望这里有人可以帮助找出问题所在。当用户按下按钮时,我调用“StartUnicastListen()”。 m_udpSock 先前定义为类变量并设置为空。根据 ReceiveFromAsync() MSDN 页面的“备注”部分,我设置了所有必需的属性和事件。

private void StartUnicastListen()
{
    m_udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    SocketAsyncEventArgs udpRecvArg = new SocketAsyncEventArgs(); 
    udpRecvLoopStart(udpRecvArg);
}

private void udpRecvLoopStart(SocketAsyncEventArgs udpRecvArg) 
{ 
    byte[] udpRecvBuffer = new byte[2048];
    udpRecvArg.SetBuffer(udpRecvBuffer, 0, udpRecvBuffer.Length); 
    udpRecvArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, 11100); 
    udpRecvArg.Completed += new EventHandler<SocketAsyncEventArgs>(udpRecvArg_Completed); 
    udpRecv(udpRecvArg); 
}    

private void udpRecv(SocketAsyncEventArgs udpRecvArg) 
{ 
     bool synchronous = false; 
     try {
         synchronous = m_udpSock.ReceiveFromAsync(udpRecvArg);
     } catch (SocketException e) {
         Log("recvUdp()\n" + e.SocketErrorCode + "\n" + e.ToString(), false); 
         return; 
     } if (synchronous)
         udpRecvArg_Completed(this, udpRecvArg); 
}

void udpRecvArg_Completed(object sender, SocketAsyncEventArgs udpRecvArg) { 

     EndPoint udpEp = udpRecvArg.RemoteEndPoint; 
     string msg = Encoding.UTF8.GetString(udpRecvArg.Buffer, udpRecvArg.Offset, udpRecvArg.BytesTransferred); 
     Log(udpEp + " " + msg,false); 
     udpRecv(udpRecvArg); 
}

关于正确使用 ReceiveFromAsync() 的文档非常有限——这似乎是 WP7 上唯一的选择——现在一般来说在 Windows Phone 7 中的 System.Net.Sockets 上。

在此先感谢您提供的任何帮助。

最佳答案

我遇到了同样的问题,但这是我想出的解决方案。正如 wilbur4321 所说,你必须先向套接字发送一些东西。此外,您不仅需要调用 SendToAsync 而忘记它,还必须等待它(最多 1 秒似乎对我有用)。

我不知道为什么你需要这样做,但发送一些东西(我只发送 1 个字节:0xFF)似乎可以解决问题。

关于c# - 在 Windows Phone 7 中异步接收 UDP 单播数据包的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6551477/

相关文章:

c# - 使用不带属性的 Newtonsoft.Json 序列化和反序列化自定义类型

c# - Paypal 中的自适应延迟链式支​​付 - 部分退款

c# - Kendo DataSource 请求序列化和反序列化不起作用

c# - 如何正确暂停/停止线程?

java.net.SocketException : Connection reset by peer: socket write error

multithreading - 国际象棋游戏: how to design the server

html - Windows 7手机Web开发问题

c# - 如何同时在多个浏览器上运行测试? Selenium 网格、C#、Specflow、NUnit

silverlight - 何时在 WP7/Silverlight 中使用依赖属性

multithreading - 有没有办法采用创建 UI 元素并使其可取消的方法?