wcf - WCF服务地址的UDP广播

标签 wcf sockets udp intranet broadcast

我在 VMware 中有一个带有 WS2008R2 服务器和 W7 客户端的实验室环境。我试图从服务器广播 WCF-service-address 并在客户端接收它。我在 C# .NET 中使用 System.Net.Sockets,我可以成功地从服务器发送数据。至少我看起来对 WinDump 没问题。但是当我尝试在客户端上接收它时它失败了。我无法理解问题出在哪里..?如果我手动输入其地址,客户端可以通过其他方式与我的 WCF 服务通信。为了以防万一,我已经在实验室环境中关闭了我的防火墙。

[更新]

我在我的客户端虚拟机上检查了 WinDump,同样的 udp 消息也出现在这里,所以它似乎能够接收广播。但是为什么 ReceieveFrom 方法没有返回任何东西呢?我是否设置错误的客户端套接字?它应该绑定(bind)到 Any-address 还是绑定(bind)到其本地 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);
    }
}

最佳答案

我不确定您当前的问题在哪里,但是通过阅读您的问题,我立即知道您正在重新发明轮子。升级到 .NET 4.0 并使用 WCF Discovery,这正是为此目的 - 基于 UDP 的具有给定契约(Contract)的服务搜索和基于 UDP 的关于服务的 announcements。此外,它基于 WS-Discovery 协议(protocol),所以我想它应该是可互操作的。它不是比定制解决方案更好吗?

关于wcf - WCF服务地址的UDP广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3793659/

相关文章:

c - 为什么要限制与套接字交互的 C 标准 I/O 流?

python - App Engine 套接字参数无效

c# - WAN 上的 TCP/UDP 套接字服务器

wcf - 如何创建 WCF 测试页?

c# - WCF 反序列化丢失子集合

.net - 如何将 TCPListener 绑定(bind)到外部 IP 地址?

c# - 以编程方式安装证书吊销列表 C#

linux - 同时 TCP 终止和后续 connect() : EADDRNOTAVAIL

java - 将 UDP 套接字绑定(bind)到多个端口

java - 多个线程监听一个 UDP 端口?