【问题标题】:How to broadcast a UDP packet on WP7 Mango?如何在 WP7 Mango 上广播 UDP 数据包?
【发布时间】:2011-08-08 14:41:11
【问题描述】:

我想从手机发送一个 UDP 数据包到有限的广播地址 (IPAddress.Broadcast = 255.255.255.255)。

这是我目前所拥有的,它适用于 Windows 应用程序:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);   
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);   

byte[] data = Encoding.UTF8.GetBytes("test data");   

SocketAsyncEventArgs a = new SocketAsyncEventArgs();   

a.RemoteEndPoint = new IPEndPoint(IPAddress.Broadcast, 11000);   
a.SetBuffer(data, 0, data.Length);   

a.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{
  Console.WriteLine(e.SocketError);
});

socket.SendToAsync(a);   

需要调用 SetSocketOption 以防止“访问被拒绝”异常。不幸的是,该方法在 WP7 上似乎不可用。 App Hub 社区站点上给出的 UDP 示例代码使用多播来实现类似的结果,但我尝试联系的设备无法处理多播。

有没有办法在 Mango 上做这种广播?

【问题讨论】:

  • 我在代码中添加了一个 Completed 事件以允许检查显示 AccessDenied 的 SocketError。如果您将其更改为执行正常(非异步)套接字调用,而忽略 SetSocketOption 调用,您将获得 AccessDenied 异常。但是你只能在 Mango 中获得异步调用。

标签: c# windows-phone-7


【解决方案1】:

您可以使用socket.ConnectAsync(a);

来自文档:

可选地,可以提供一个缓冲区,该缓冲区将在 ConnectAsync 方法成功后自动发送到套接字上。 (UDP是无连接协议,网络正常时应该一直发送)

【讨论】:

  • 如果您设置了缓冲区,ConnectAsync 实际上会发送数据!?
  • 我终于让它工作了。有趣的是,我只能让它在 WP7 上工作。在 Windows 中运行它时出现“错误参数”错误。
  • 另外,根据文档,如果尝试连接到广播地址并且未设置套接字选项,则 ConnectAsync 应该引发异常。所以这不应该真的有效,我不确定我是否要依赖这种行为。
  • @crappy 仅在 Net 4 文档中。在 Silverlight 文档中不是 msdn.microsoft.com/en-us/library/bb538102(v=VS.95).aspx
  • 谢谢@Skomski。我经常错过我正在查看的文档版本。 ://
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 2011-12-04
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
相关资源
最近更新 更多