如何在WP7 Mango上广播一个UDP数据包?

5

我希望能够从手机向有限广播地址(IPAddress.Broadcast = 255.255.255.255)发送一个UDP数据包。

目前我已经编写了以下代码,在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上有没有办法进行这种广播?


我在代码中添加了一个“已完成”事件,以便检查SocketError,该错误显示AccessDenied。如果您将其更改为执行普通(非异步)套接字调用,并省略SetSocketOption调用,则会收到AccessDenied异常。但是,在Mango中只会得到异步调用。 - Dave Carlile
1个回答

2
你可以使用socket.ConnectAsync(a);来自文档: 可选地,可以提供一个缓冲区,在ConnectAsync方法成功之后原子地发送到套接字上。(UDP是一种无连接协议,在网络运行时应始终发送)

ConnectAsync如果设置了缓冲区,实际上会发送数据! - Dave Carlile
我终于让它工作了。有趣的是,我只能在WP7上让它工作。在Windows上运行时,我会收到一个“错误参数”的错误提示。 - Dave Carlile
根据文档,如果尝试连接到广播地址并且套接字选项未设置,则ConnectAsync应该引发异常。因此,这实际上不应该起作用,我不确定是否要依赖此行为。 - Dave Carlile
1
@crappy 只有在 .Net 4 文档中提到。在 Silverlight 文档中并没有。http://msdn.microsoft.com/en-us/library/bb538102(v=VS.95).aspx - Skomski
谢谢@Skomski。我经常会错过我正在查看的文档版本。 :/ - Dave Carlile
即使远程主机已关闭,我仍然收到SocketError.Success!很有趣... - Abhijeet Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接