2014-11-28 11 views
5

Also, ich schreibe dieses Schulprojekt, das ein grundlegendes Chat-Programm sein sollte, das aus einem Client und einem Server besteht. Ich versuche, entweder den Server oder die Klientenprogramme zu behandeln, die geschlossen werden.C# Socket-Programmierung, Schließen von Fenstern

Also, wenn Sie den großen roten X im Client-Fenster drücken, dann ist dies, was passiert:

private void Window_Closing(object sender, CancelEventArgs e) 
{ 
    Data msgToSend = new Data(); 
    msgToSend.cmdCommand = Command.Logout; 
    msgToSend.strName = LoginName; 
    byte[] b = msgToSend.ToByte(); 
    ClientSocket.Send(b); 
} 

Er sendet eine Nachricht an den Server es darüber informiert, dass jemand sich abzumelden, so kann es den Benutzer entfernen aus der Benutzerliste usw.

Das Problem tritt auf, wenn der Server geschlossen wird und versucht, eine Nachricht an die Clients zu senden, die sie darüber informiert, dass der Server heruntergefahren wurde, sodass die Clients die Benutzer informieren und schließen können .

So die Nachricht des Servers ankommt, und das Client-Programm wird geschlossen, aber der obige Code wird versuchen, den Server fälschlicherweise über die Abmeldung zu informieren, aber der Server ist zu diesem Zeitpunkt bereits heruntergefahren, so wird es ein Ganzes Viele Fehlermeldungen.

Ich denke, ich würde eine Art 'if' Anweisung in der obigen Prozedur benötigen, die entscheiden könnte, ob der Code ausgeführt werden soll, aber ich habe keine Ahnung, was es sein sollte. Ideen?

Antwort

3

Überprüfen Sie einfach, ob der Client mit dem Server verbunden ist. Beide Socket und TcpClient Klassen haben eine Connected Eigenschaft:

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.connected%28v=vs.110%29.aspx http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.connected(v=vs.110).aspx

Anschließend können Sie tun:

if (client.Connected) { 
     Data msgToSend = new Data(); 
     msgToSend.cmdCommand = Command.Logout; 
     msgToSend.strName = LoginName; 
     byte[] b = msgToSend.ToByte(); 
     ClientSocket.Send(b); 
}