Операция ввода/вывода была прервана из-за завершения потока команд или по запросу приложения
мое приложение работает как клиентское приложение для сервера банка. Приложение отправляет запрос и получает ответ от банка. Это приложение обычно работает нормально, но иногда
операция ввода/вывода была прервана из-за завершения потока команд или заявление
ошибка с кодом ошибки как 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