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

本文关键字:单播 UDP 数据包 问题 Phone 异步 Windows | 更新日期: 2023-09-27 18:00:58

我正试图让我的Windows Phone 7 Mango应用程序监听传入的UDP数据包,但时间很长。我安装了Windows Phone 7.1 SDK的新Beta 2更新版和开发工具。我尝试与此MSDN示例的任何偏差都会导致SocketException 10022,"提供了一个无效的参数"。

我的代码粘贴在下面。我一直在尝试调整我在这篇stackoverflow帖子中发现的代码,但没有成功。此行在到达时生成异常:

synchronous = m_udpSock.ReceiveFromAsync(udpRecvArg);

我希望这里有人能帮我找出问题所在。当用户按下按钮时,我调用"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); 
}

关于ReceiveFromAsync((的正确使用,文档非常有限,这似乎是WP7和Windows Phone 7中的System.Net.Sockets上的唯一选项。

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

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

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

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

您在http://msdn.microsoft.com/en-us/library/hh202864(v=VS.92(.aspx#Y4537?

考虑到TCP套接字仅在Mango中是客户端,我想知道UDP套接字是否只有在发送了一些东西之后才能工作?我建议你试试。如果这不起作用,你能把你的整个项目发布在dropbox或类似的网站上吗?我会看看的

谢谢,--随机

我在"Win7 UDP服务器"示例中发现了一件奇怪的事情即服务器端UDP套接字不"绑定">

在我的实验中,在一个不绑定的套接字上调用"ReceiveFromAsync",抛出"无效参数"异常。在"ReceiveFromAsync"之前绑定之后,至少"ReceiveFrom异步"不会引发"无效参数"异常

我的代码与您的代码相似,但仍然存在一些问题。看起来,我调用了一次"ReceiveFromAsync",但操作系统触发了两次事件回调,这导致了非常严重的竞争情况。

关于"UDP+SocketAsyncEventArgs"的示例文档太少了。也许我必须恢复使用"BeginReceiveFrom"。

您需要从SendTAsync((的Completed事件调用ReceiveFormAsync((。。否则,您将得到此异常。。