Программирование сокетов - PullRequest
0 голосов
/ 30 марта 2009

В симуляции лан-мессенджера в c # я использую адрес обратной связи только для начала, чтобы проверить функциональность кода. Однако после отправки нескольких сообщений я получаю исключение сокета при использовании метода end-connect и затем исключение сокета при отправке данных. Есть ли причина этого исключения.

    private void button1_Click(object sender, EventArgs e)
    {

        HideCaret(this.textBox1.Handle);
        StringBuilder sb = new StringBuilder(this.textBox1.Text);
        str = this.textBox2.Text;
        Socket newsock = new Socket(AddressFamily.InterNetwork,socketType.Stream,   ProtocolType.Tcp);
        IPEndPoint ip = new IPEndPoint(localaddress, 5555);
        newsock.BeginConnect(ip, new AsyncCallback(connected), newsock);
        if (str != "")
        {
            sb.AppendLine(this.textBox2.Text);
            this.textBox1.Text = sb.ToString();
            this.textBox2.Text = "\0";
            send = Encoding.ASCII.GetBytes(str);
            try
            {
                newsock.BeginSend(send, 0, send.Length, SocketFlags.None, new AsyncCallback(sent), newsock);
            }
            catch (ArgumentException)
            {
                MessageBox.Show("arguments incorrect in begin-send call", "Error", MessageBoxButtons.OK);
            }
            catch (SocketException)
            {
                MessageBox.Show("error in accessing socket while sending", "Error", MessageBoxButtons.OK);
            }
            catch (ObjectDisposedException)
            {
                MessageBox.Show("socket closed while sending", "Error", MessageBoxButtons.OK);
            }
            catch (Exception)
            {
                MessageBox.Show("error while sending", "Error", MessageBoxButtons.OK);
            }

        }                                 

    }

Пожалуйста, помогите

Ответы [ 3 ]

4 голосов
/ 30 марта 2009

Это возможно потому, что вы не ожидаете подключения сокета перед отправкой данных. У вас есть два варианта:

  1. Отправка данных асинхронно из вашего connected метода обратного вызова.
  2. Отправляйте данные синхронно, блокируя этот поток до тех пор, пока он не будет подключен.

Вы достигли # 1, объединив данные для отправки и сокета в новый класс, а затем передали это как state в своем вызове BeginConnect. Затем переместите код отправки в метод обратного вызова.

Вы выполняете # 2, настраивая System.Threading.ManualResetEvent и вызывая WaitOne после BeginConnect. Затем вызовите EndConnect в вашем методе обратного вызова connected, а затем Set на вашем ManualResetEvent. Затем перейдите к отправке, как указано выше.


Вы также, вероятно, узнаете больше, если узнаете, что за SocketException вы получаете.

Из документации MSDN:

Если вы получите SocketException, используйте SocketException.ErrorCode свойство для получения конкретной ошибки код. После того, как вы получили это код, обратитесь к сокетам Windows документация кода ошибки API версии 2 в библиотеке MSDN для подробного описание ошибки.

0 голосов
/ 11 марта 2012

Вы также можете использовать метод .Net Socket.Connect, он заблокирует ваш код до подключения. Таким образом, вам не нужно использовать ManualResetEvent и звонить WaitOne. И вы также можете использовать другие сокетные асинхронные методы.

0 голосов
/ 30 марта 2009

У вас есть отдельный поток чтения из сокета? Если нет, то ваши буферы сокетов, вероятно, заполняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...