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

时间:2011-07-01 17:51:45

标签: 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以前被定义为类变量并设置为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。

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

鉴于TCP套接字仅在Mango中是客户端的,我想知道UDP套接字可能只在发送了什么后才能工作?我建议尝试一下。如果这不起作用,你可以将你的整个项目发布在Dropbox等上,我会看看它。

谢谢, --randy

答案 2 :(得分:1)

我在“Win7 UDP服务器”示例中发现了一件奇怪的事情 即服务器端UDP套接字没有“绑定”

在我的实验中,在没有绑定的套接字上调用“ReceiveFromAsync”,抛出“invalid argument”异常。在“ReceiveFromAsync”之前绑定之后,至少“ReceiveFromAsync”不会抛出“无效参数”异常。

我的代码与您的代码类似,但仍存在一些问题。看起来,我称之为“ReceiveFromAsync”一次,但操作系统两次触发事件回调,导致非常严重的竞争条件。

关于“UDP + SocketAsyncEventArgs”的文档很少。也许我必须恢复使用“BeginReceiveFrom”。

答案 3 :(得分:0)

您需要从SendTAsync()的Completed事件中调用ReceiveFormAsync()..否则,您将收到此异常..