Серверное приложение закрывается при получении сообщения - PullRequest
0 голосов
/ 23 августа 2011

Что ж, я делаю приложение клиент-сервер и могу нормально отправлять сообщения своему клиенту, но когда я делаю это наоборот (клиент-сервер), приложение сервера просто закрывается, любая помощь в том, как исправить это?

public void OnDataReceived(IAsyncResult asyn)
    {
        try
        {
            SocketPacket socketData = (SocketPacket)asyn.AsyncState;

            int iRx = 0;
            iRx = socketData.m_currentSocket.EndReceive(asyn);
            char[] chars = new char[iRx + 1];
            System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
            int charLen = d.GetChars(socketData.dataBuffer,
                                     0, iRx, chars, 0);
            System.String szData = new System.String(chars);
            area1.AppendText(szData);


            WaitForData(socketData.m_currentSocket); // Continue the waiting for data on the Socket
        }
        catch (ObjectDisposedException)
        {
            System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n");
        }
        catch (SocketException se)
        {
            MessageBox.Show(se.Message);
        }
    }

После выполнения некоторых точек останова я понял, что он закрывается после достижения этой части, когда он пытается добавить ее к тексту. Он закрывается без ошибки.

Есть идеи как это исправить? Я думаю, что-то делать с потоками, но не уверен, почему он просто закрывается.

1 Ответ

2 голосов
/ 23 августа 2011

Возникает ли исключение при вызове AppendText?Если да, можете ли вы включить стек вызовов?Являются ли szData действительными данными при вызове AppendText?Попробуйте использовать код try / catch для получения информации об исключении:

try
{
    ... your code...
}
catch (Exception e)
{
    ... examine 'e' in the debugger or dump it to a log file
}

Одна вещь, которая может пойти не так, это то, что вы обращаетесь к элементу управления UI из потока, не являющегося UI, но это может бытьдругие вещи.Трудно сказать по фрагменту кода, который вы опубликовали.

Обновлено: если исключение было из-за того, что элемент управления вызывается из неправильного потока, вы можете попробовать добавить такую ​​функцию, а затем вызывать ее вместо доступа куправление напрямую (не проверено):

    private void AppendText(string text)
    {
        // InvokeRequired required compares the thread ID of the
        // calling thread to the thread ID of the creating thread.
        // If these threads are different, it returns true.
        if (this.area1.InvokeRequired)
        {   
            SetTextCallback d = new AppendTextCallback(AppendText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.area1.AppendText(text);
        }
    }
...