2011-07-01 42 views
8

我试图让我的Windows Phone 7 Mango应用程序侦听传入的UDP数据包,但有一段时间。我已安装Windows Phone 7.1 SDK和开发工具的新Beta 2版本。任何偏离我尝试从这MSDN sample结果在一个SocketException 10022,“提供了一个无效的参数”。在Windows Phone 7中异步接收UDP单播数据包的问题

我的代码粘贴在下面。我一直在尝试修改我在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现在。

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

+0

我有一个类似的问题。出于某种原因,我也在ReceiveFromAsync上遇到异常。 –

+0

同样的问题在这里。 – IDWMaster

+0

同样的问题在这里:| – Antimony

回答

1

我发现, “Win7的UDP服务器” 样本中的一件奇怪的事情 即服务器端UDP套接字不 “绑定”

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

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

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

3

我有同样的问题,但这里是我想出的解决方案。正如wilbur4321所说,你必须先发送一些东西到socket。此外,您不仅需要调用SendToAsync并忘记它,还必须等待(最长1秒似乎适用于我)。

我不知道为什么你需要这样做,但发送一些东西(我只是发送1字节:0xFF)似乎有伎俩。

+0

这确实允许调用ReceiveFromAsync。问题是,我似乎只能从我发送的任何端点接收数据包。我无法接收广播数据包。 –

0

你需要从SendTAsync()的Completed事件调用ReceiveFormAsync()..否则,你会得到这个异常..