Ich habe an einem Socket-Client-Programm in C# gearbeitet und frage mich, wie man erkennen kann, wenn das andere Ende eines Sockets sich "ungracefully" getrennt hat, z. B. wenn ein Netzwerkkabel abgezogen oder ein Hard Reset durchgeführt wurde.
Ich habe diese Funktionen unten, um die Steckdose zugreifen und nach der SO Frage aquí und dies MSDN-Artikel Der beste Weg, um zu prüfen, ob ein Socket getrennt wurde, besteht darin, eine 1-Byte-Nachricht mit einer Länge von 0 zu senden. Wenn eine Ausnahme ausgelöst wird und WSAEWOULDBLOCK nicht der Fehlercode ist, ist der Socket getrennt. Ich habe dies versucht, aber nachdem ich die Serververbindung zurückgesetzt habe, ruft der Client Send(new byte[1], 0, 0, SocketFlags.None)
und erfolgreich zurückkehren und die Receive()
Befehl gleich danach den Fehler WSAEWOULDBLOCK zurück.
Was ist los?
Hier ist mein Code unten. _socket
ist auf den nicht blockierenden Modus eingestellt:
private int nonBlockRecv(byte[] recvBytes, int offset, int size, SocketFlags sf)
{
int bytesRecv = 0;
while (true)
{
try
{
nonBlockSend(new byte[1], 0, 0, sf);
bytesRecv = _socket.Receive(recvBytes, offset, size, sf);
break;
}
catch (SocketException excp)
{
if (excp.ErrorCode != 10035) // WSAEWOULDBLOCK
throw excp;
}
}
return bytesRecv;
}
private int nonBlockSend(byte[] sendBytes, int offset, int size, SocketFlags sf)
{
int bytesSent = 0;
while (true)
{
try
{
_socket.Send(sendBytes, offset, size, sf);
break;
}
catch (SocketException excp)
{
if (excp.ErrorCode != 10035) // WSAEWOULDBLOCK
throw excp;
}
}
return bytesSent;
}
Bearbeiten: Dies kann von Vorteil sein, aber der Server ist ein Windows Mobile-Gerät. Ich habe in einem anderen Thread gelesen, dass verschiedene Betriebssysteme in der Lage sein könnten, Socket-Close-Signale zu senden, wenn sie sterben. Vielleicht das Windows Mobile OS nicht tun dies??