Нужна помощь с обнаружением многоадресного udp-сервера в c #

Как своего рода продолжение this question У меня есть решение, работающее на моем локальном компьютере, но не на компьютере в сети.

Я не слишком много знаю о сокетах, кроме основ, так что потерпите меня. Цель состоит в том, чтобы клиент искал сервер в локальной сети, и это результат некоторого вырезания / вставки / редактирования кода.

Это клиентский код:

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);

    byte[] data = new byte[1024];
    public Form1()
    {
        InitializeComponent();

    }

    private void button1_Click(object sender, EventArgs e)
    {

        Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10);
        string welcome = "What's your IP?";
        data = Encoding.ASCII.GetBytes(welcome);
        client.SendTo(data, data.Length, SocketFlags.None, ipep);
        IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);
        EndPoint tmpRemote = (EndPoint)server;
        data = new byte[1024];
        int recv = client.ReceiveFrom(data, ref tmpRemote);
        this.IP.Text = ((IPEndPoint)tmpRemote).Address.ToString(); //set textbox
        this.Port.Text = Encoding.ASCII.GetString(data, 0, recv); //set textbox
        client.Close();
    }

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

int recv;
        byte[] data = new byte[1024];
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 10294);
        Socket newsock = new Socket(AddressFamily.InterNetwork,
                SocketType.Dgram, ProtocolType.Udp);
        newsock.Bind(ipep);
        newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any,IPAddress.Parse("127.0.0.1")));

        while (true)
        {
            Console.WriteLine("Waiting for a client...");
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint tmpRemote = (EndPoint)(sender);
            data = new byte[1024];
            recv = newsock.ReceiveFrom(data, ref tmpRemote);
            Console.WriteLine("Message received from {0}:", tmpRemote.ToString());
            Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
            string welcome = "7010";
            data = Encoding.ASCII.GetBytes(welcome);
            newsock.SendTo(data, data.Length, SocketFlags.None, tmpRemote);
        }

Он работает на моем локальном компьютере (как на сервере, так и на клиенте), но когда я пробую другой компьютер в той же сети, я получаю «Существующее соединение было принудительно закрыто удаленным хостом»

Я понимаю, что мне нужно добавить много попыток / уловок, но я просто пытаюсь сначала понять, как это работает.


person Davy8    schedule 17.10.2008    source источник


Ответы (2)


Я должен начать с того, что ничего не знаю о C #, но ...

Глядя на определение ipep в клиентском коде, похоже, что вы пытаетесь отправить свои данные себе, а не транслировать их (как было предложено в вашем другом вопросе). Мое внимание привлекло то, что «127.0.0.1» - это адрес «localhost».

Это объясняет, почему он хорошо работает, когда вы запускаете и клиент, и сервер на одном компьютере, поскольку он будет отправлять сообщения самому себе.

Я ожидал, что правильная конечная точка будет для широковещательного адреса (например, «255.255.255.255») - хотя вы также можете выбрать широковещательный адрес локальной сети, в которой вы находитесь, в зависимости от того, насколько широко вы хотите транслировать.

person Andrew Edgecombe    schedule 18.10.2008
comment
Да, оглядываясь на это после того, как вы упомянули, что это имеет смысл, в то время (поскольку это в основном скопированный / вставленный код) я предполагал, что это было то место, откуда я отправлял, что, конечно, если я остановился, чтобы подумать об этом еще немного, не смысл указать, откуда я отправляю. - person Davy8; 19.10.2008
comment
Я не смогу попробовать это до понедельника, но я ставлю +1 и соглашусь, если это сработает! - person Davy8; 19.10.2008

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);

Должно стать:

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 10294);

И

newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("127.0.0.1")));

Должно стать

newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("255.255.255.255")));

Я думаю.

Хорошо, это не работает, значит, что-то все еще не так.

person ForbesLindesay    schedule 04.03.2010