Передача UDP адреса службы WCF - PullRequest
1 голос
/ 25 сентября 2010

У меня есть лабораторная среда в VMware с WS2008R2-сервером и W7-клиентом.Я пытаюсь передать WCF-сервис-адрес с сервера и получить его на клиенте.Я использую System.Net.Sockets в C # .NET, и я могу успешно отправлять данные с сервера.Я выгляжу нормально с WinDump по крайней мере.Но когда я пытаюсь получить это на клиенте, это терпит неудачу.Я не могу понять, где проблема ..?Клиент может общаться с сервером другими способами и с моим WCF-сервисом, если я вручную введу его адрес.Я включил свои брандмауэры в лабораторной среде на всякий случай.

[Update]

Я проверил WinDump на моем client-vm, и то же самое udp-сообщение появляется здесь такжекажется, что он сможет принимать трансляцию.Но почему метод ReceieveFrom ничего не возвращает?Я неправильно настроил клиентский сокет?Должен ли он связываться с Any-адресом или локальным IP-адресом?Ни то, ни другое не работает ...

[/ Update]

Вот код сервера:

    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 Ответ

4 голосов
/ 25 сентября 2010

Я не уверен, где ваша текущая проблема, но, прочитав ваш вопрос, я сразу понял, что вы изобретаете колесо.Обновите до .NET 4.0 и используйте WCF Discovery , который предназначен именно для этой цели - поиск службы на основе UDP с данным контрактом и основанные на UDP объявления об услугах.Более того, он основан на протоколе WS-Discovery, поэтому, я думаю, он должен быть совместимым.Разве это не лучше, чем индивидуальное решение?

...