Операция ввода/вывода была прервана из-за завершения потока команд или по запросу приложения

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

операция ввода/вывода была прервана из-за завершения потока команд или заявление

ошибка с кодом ошибки как 995 идет.

public void OnDataReceived(IAsyncResult asyn)
{
    BLCommonFunctions.WriteLogger(0, "In :- OnDataReceived", 
                                        ref swReceivedLogWriter, strLogPath, 0);
    try
    {
        SocketPacket theSockId = (SocketPacket)asyn.AsyncState;

        int iRx = theSockId.thisSocket.EndReceive(asyn); //Here error is coming
        string strHEX = BLCommonFunctions.ByteArrToHex(theSockId.dataBuffer);                    

    }
}

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

С уважением, Ashish Khandelwal

2 ответов


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

получать 0 байт EndRecieve означает, что сокет был закрыт, как и большинство исключений, которые EndRecieve бросит.

вам нужно начать разбираться с этими ситуациями.

никогда не игнорируйте исключения, они выбрасываются для причина.

обновление

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

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

как для прием обратного вызова более правильный способ обработки это что-то вроде этого (полу псевдо-код):

public void OnDataReceived(IAsyncResult asyn)
{
    BLCommonFunctions.WriteLogger(0, "In :- OnDataReceived", ref swReceivedLogWriter, strLogPath, 0);

    try
    {
        SocketPacket client = (SocketPacket)asyn.AsyncState;

        int bytesReceived = client.thisSocket.EndReceive(asyn); //Here error is coming
        if (bytesReceived == 0)
        {
          HandleDisconnect(client);
          return;
        }
    }
    catch (Exception err)
    {
       HandleDisconnect(client);
    }

    try
    {
        string strHEX = BLCommonFunctions.ByteArrToHex(theSockId.dataBuffer);                    

        //do your handling here
    }
    catch (Exception err)
    {
        // Your logic threw an exception. handle it accordinhly
    }

    try
    {
       client.thisSocket.BeginRecieve(.. all parameters ..);
    }
    catch (Exception err)
    {
       HandleDisconnect(client);
    }
}

причина, по которой я использую три блока catch, просто потому, что логика для среднего отличается от двух других. Исключения из BeginReceive / EndReceive обычно указывают на отключение сокета, в то время как исключения из вашей логики не должны останавливать получение сокета.


у меня была такая же проблема с RS232 связи. Причина в том, что ваша программа выполняется намного быстрее, чем comport (или медленная последовательная связь).

чтобы исправить это, я должен проверить, если IAsyncResult.IsCompleted==true. Если не завершено, то IAsyncResult.AsyncWaitHandle.WaitOne()

такой :

Stream s = this.GetStream();
IAsyncResult ar = s.BeginWrite(data, 0, data.Lengt