Можно ли забиндить клиентский сокет?

255
21 января 2017, 09:43

Пытаюсь сделать сокет-клиент, в задании сказано, что необходимо реализовывать отправку всегда с определенного порта (к примеру 50000-го). Пытался вызывать bind метод перед send, первый раз все отлично получается, сообщение отправляется с того адреса, который я задал, но в последующие разы выходит исключение, что "обычно разрешено использовать только один адрес". После перезагрузки формы, все опять повторяется, 1-е сообщение ок, потом выходит исключение. Прочитал, что такое происходит, потому что порт не освободился после первого раза и по советам пытался закрывать клиент close, делать в конце dispose и send_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true), к сожалению ничего не помогает. Это вообще возможно отправлять всегда с одного заданного порта? Сообщений должно большое количество отправляться, может быть пару раз в секунду. Код моего клиента:

    private void button2_Click_1(object sender, EventArgs e)
    {
        string local_host = System.Net.Dns.GetHostName();
        string local_ip_address = Dns.GetHostByName(local_host).AddressList[0].ToString();
        IPEndPoint send_point = new IPEndPoint(IPAddress.Parse(local_ip_address), 50000);
        Socket send_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint connected_point = new IPEndPoint(IPAddress.Parse(textBoxIPListen.Text), 
                                                    Convert.ToInt32(textBoxPortListen.Text));
        try
        {
            send_socket.Bind(send_point);
            send_socket.Connect(connected_point);
            byte[] data = Encoding.Unicode.GetBytes("TestTest");
            send_socket.Send(data);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        finally
        {
            send_socket.Close();
            ((IDisposable)send_socket).Dispose();
        }
    }
Answer 1

Попробуйте не просто закрывать сокет, а делать shutdown для него. Похоже, вы повторно пытаетесь использовать зарезервированный адрес. После перезапуска формы ресурсы "железно" высвобождаются, и соответственно, вы можете заново использовать данные для регистрации сокета. Там вообще есть группа методов, они используются в разных сценариях (Shutdown, Disconnect, close). Еще было бы хорошей идеей, вытащить ресурсы сокета из формы в отдельный метод, и при старте программы производить инициализацию сети, а потом уже, связывать эти ресурсы с какой либо логикой. К примеру, создайте отдельно методы для создания сокета на данном адресе и свяжите его с действием нажатия по кнопке connect, аналогично с disconnect.

READ ALSO
Не выводятся данные из бд

Не выводятся данные из бд

Не выводятся данные которые я вносил в бдПри прохождении кода дебагером после строки db

322
Удаление элементов из коллекции

Удаление элементов из коллекции

Есть абстрактный класс Shape:

344
Может кто объяснить, что делает каждая строка? [требует правки]

Может кто объяснить, что делает каждая строка? [требует правки]

Саму программу я заказал мне её сделали и дали код, но если препод спросит нужно объяснить что делает какая либо строкаПрограмма для слежение...

281
Как выбрать информацию из Mysql

Как выбрать информацию из Mysql

Есть у меня форма на стороне клиента с двумя выпадющими меню, он там выбирает год и тип обложки

257