995 - ошибка, сообщаемая IO Completion Port .Ошибка возникает, когда вы пытаетесь продолжить чтение из сокета, когда он, скорее всего, был закрыт.
Получение 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 обычно указывают на отключение сокета, в то время как исключения из вашей логики не должны останавливать получение сокета.