Async Client Server System.Net.Sockets.SocketException после первого запуска - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть асинхронный клиент-сервер, на котором данные отправляются туда и обратно.Последовательность успешно завершается и соответствующим образом закрывает сокетное соединение в первый раз.По нажатию кнопки та же последовательность должна произойти.Однако иногда возникает SocketException, когда клиент пытается отправить данные на сервер после первого запуска.

Я делаю что-то не так с установлением соединения, это связано с синхронизацией, или я пропускаю что-то еще, что может вызвать ошибку?

Я добавил _baseSocket.Poll ()в попытке решить эту проблему.Это улучшило производительность, но я все равно получаю ошибку сбоя в конечном итоге, повторяя процесс, в основном, когда я слишком быстро нажимаю кнопку, чтобы перезапустить процесс.Если у меня есть точка останова, она работает каждый раз.Я попытался добавить некоторые временные задержки, но это также не решило эту проблему.

Основная форма WPF

private void connectCallback(object sender, string error)
{
    if(!Dispatcher.CheckAccess())
    {
        Dispatcher.Invoke(new ConnectCallback(connectCallback), sender, 
            error);
        return;
    }
}  

OtherClass

public void Connect(string hostName, int port, ConnectCallback callback)
{
    _connectCallback = callback;
    _baseSocket.BeginConnect(hostName, port, connectCallback, null);
}

private void connectCallback(IAsyncResult ar)
{
    string error = null;
    try
    {
        _baseSocket.EndConnect(ar);
        EndPoint = (IPEndPoint)_baseSocket.RemoteEndPoint;
    }
    catch(Exception ex)
    {
        error = ex.Message;
    }

    _connectCallback(this, error);
}


public void Send(string data, int bufferSize)
{
    byte[] bData = Encoding.ASCII.GetBytes(data);
    byte[] sendBuffer = new byte[bufferSize];
    bData.CopyTo(sendBuffer, 0);


    _baseSocket.Poll(10, SelectMode.SelectWrite);
    _baseSocket.sendBuffer, 0, sendBuffer.Length, SocketFlags.None, new 
        AsyncCallback(SendCallback), _baseSocket);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...