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上的唯一选项。
提前感谢您提供的任何帮助。
我也遇到过同样的问题,但这是我提出的解决方案。正如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((。。否则,您将得到此异常。。