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

gre*_*ake 8 c# sockets asynchronous udp windows-phone-7

我正在尝试让我的Windows Phone 7 Mango应用程序收听传入的UDP数据包,但有一点时间.我安装了Windows Phone 7.1 SDK和开发工具的新Beta 2更新.我从这个MSDN示例中尝试的任何偏差都会导致SocketException 10022,"提供了无效的参数".

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

synchronous = m_udpSock.ReceiveFromAsync(udpRecvArg);
Run Code Online (Sandbox Code Playgroud)

我希望这里有人可以帮助确定出现了什么问题.当用户按下按钮时,我正在调用"StartUnicastListen()".m_udpSock以前被定义为类变量并设置为null.根据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); 
}
Run Code Online (Sandbox Code Playgroud)

正是这样有限的文档正确使用了ReceiveFromAsync() - 这似乎是WP7上的唯一选择 - 现在通常是Windows Phone 7中的System.Net.Sockets.

提前感谢您提供的任何帮助.

小智 1

您是否看过http://msdn.microsoft.com/en-us/library/hh202864(v=VS.92).aspx#Y4537上的示例?

鉴于 TCP 套接字在 Mango 中仅适用于客户端,我想知道 UDP 套接字是否只能在发送内容后才能工作?我建议尝试一下。如果这不起作用,您可以将整个项目发布到 dropbox 等上,我会查看。

谢谢,--兰迪