2014-11-28 16 views
5

Tak więc piszę ten szkolny projekt, który powinien być podstawowym programem do czatowania, który składa się z klienta i serwera. Próbuję obsługiwać serwer lub programy klienckie są zamknięte.C# Programowanie gniazd, zamykanie okien

Więc po naciśnięciu duży czerwony X w oknie klienta, to jest to, co się dzieje:

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); 
} 

wysyła komunikat do serwera informując go, że ktoś loguje się, więc można go usunąć użytkownika z listy użytkowników itp.

Problem pojawia się, gdy serwer jest zamykany, i próbuje wysłać wiadomość do klientów informując, że serwer został zamknięty, aby klienci mogli poinformować użytkowników, a następnie zamknąć .

Pojawia się komunikat serwera, a program klienta wkrótce się zamknie, ale powyższy kod spróbuje poinformować serwer fałszywie o wylogowaniu, ale serwer jest już wyłączony, więc będzie cały czas wiele komunikatów o błędach.

Sądzę, że potrzebowałbym pewnego rodzaju instrukcji "if" w powyższej procedurze, która mogłaby zdecydować, czy kod powinien działać, ale nie mam pojęcia, co to powinno być. Pomysły?

Odpowiedz

3

Wystarczy sprawdzić, czy klient jest podłączony do serwera. Oba Socket i TcpClient zajęcia mają Connected właściwość:

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

Można wtedy zrobić:

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