我在VMware中拥有一个带有WS2008R2服务器和W7客户端的实验室环境。我试图从服务器广播WCF服务地址,并在客户端接收。我在C#.NET中使用System.Net.Sockets,我可以成功地从服务器发送数据。至少我对WinDump看起来没问题。但是当我试图在客户端上收到它时,它失败了。我不明白问题出在哪里..?如果我手动输入其地址,客户端可以通过其他方式与我的WCF服务与服务器通信。为了以防万一,我已经在实验室环境中关闭了防火墙。
[更新]
我在我的客户端-vm上检查了WinDump,同样的udp-message也显示在这里,所以它似乎能够接收广播。但是为什么ReceieveFrom方法不会返回任何东西?我是否设置了客户端套接字错误?它应该绑定到Any-address还是其本地ip?两者都不起作用......
[/更新]
继承服务器代码:
public static class MulticastServer
{
static Socket socket;
static IPEndPoint ep = new IPEndPoint(IPAddress.Broadcast, 9050);
public static void Open()
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
}
public static void Send(string message)
{
socket.SendTo(Encoding.ASCII.GetBytes(message), ep);
}
public static void Close()
{
socket.Close();
}
}
客户:
public static class MulticastClient
{
public static string ReceiveOne()
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, 9050);
socket.Bind(ep);
byte[] data = new byte[1024];
EndPoint e = (EndPoint)ep;
int i = socket.ReceiveFrom(data, ref e);
socket.Close();
return Encoding.ASCII.GetString(data, 0, i);
}
}
答案 0 :(得分:4)
我不确定你当前的问题在哪里,但通过阅读你的问题,我立即知道你正在重新发明轮子。升级到.NET 4.0并使用WCF Discovery,这正是为此目的 - 基于UDP的搜索服务与给定的合同和基于UDP的announcements有关服务。此外,它基于WS-Discovery协议,所以我猜它应该是可互操作的。它不比定制解决方案好吗?