Я знаю, что уже поздно, но я нашел хитрое решение для этого.
Мне приходилось связываться с сторонним программным обеспечением, которое ожидало возврат каретки при каждой отправленной команде, в противном случае оно игнорировалось.
Во время основной фазы мой клиентский сокет был в цикле, получая ответы от стороннего программного обеспечения. Мое решение не идеальное, но основная предпосылка состоит в том, что я помещаю тайм-аут приема в сокет, чтобы цикл попытался прочитать в течение 5 секунд, затем попал в ловушку, а затем повторил цикл. Перед каждым получением я вызываю свой собственный метод isconnected, который выполняет небольшую запись без возврата каретки, поэтому он игнорируется сторонним программным обеспечением, но при этом дает мне надежный сигнал сбоя в случае сбоя сети. Все, что я делаю в случае неудачной записи, - это генерирую исключение LostConnectionException и обрабатываю его извне.
Если вы пишете как сервер, так и клиент, вы можете легко придумать какой-нибудь контрольный символ, который другой игнорирует.
Это может быть не идеально, но это надежно для меня.
while (numberOfBytesRead == 0)
{
try
{
IsConnected();
_socket.ReceiveTimeout = 5000;
numberOfBytesRead = _socket.Receive(myReadBuffer, 0, myReadBuffer.Length, SocketFlags.None);
}
catch (Exception e)
{
if (e.GetType() == typeof (LostConnection))
{
Status = SocketStatus.offline;
throw;
}
}
}
и метод isconnected будет выглядеть примерно так
public bool IsConnected(Socket s)
{
try
{
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] buffer = encoder.GetBytes("test");
s.Send(buffer, 0, buffer.Length, SocketFlags.None);
}
catch (Exception)
{
throw new LostConnection();
}
return s.Connected;
}