代码之家  ›  专栏  ›  技术社区  ›  Andreas Zita

WCF服务地址的UDP广播

  •  1
  • Andreas Zita  · 技术社区  · 15 年前

    我在VMware中有一个实验室环境,有一个WS2008R2服务器和一个W7客户机。我正在尝试从服务器广播WCF服务地址,并在客户端中接收该地址。我在c.net中使用system.net.sockets,我可以成功地从服务器发送数据。至少我对温杜普没意见。但是当我尝试在客户机上接收这个消息时失败了。我不明白问题在哪里….如果我手动输入服务器的地址,客户端可以通过其他方式与服务器以及我的WCF服务通信。为了以防万一,我把实验室的防火墙关掉了。

    [更新]

    我检查了我的客户机vm上的windump,同样的udp消息也显示在这里,所以它似乎能够接收广播。但是为什么ReceiveFrom方法没有返回任何内容呢?我是否设置了错误的客户端套接字?它应该绑定到任何地址还是本地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);
        }
    }
    
    1 回复  |  直到 15 年前
        1
  •  4
  •   Ladislav Mrnka    15 年前

    我不知道你现在的问题在哪里,但通过阅读你的问题,我立刻知道你在重新发明一个轮子。升级到.NET 4.0并使用 WCF Discovery 这正是为了这个目的-基于UDP的搜索具有给定合同和基于UDP的服务 announcements 关于服务。而且它是基于WS-Discovery协议的,所以我想它应该是可互操作的。它不是比定制解决方案更好吗?

    推荐文章