2011-02-18 2 views
1

У меня есть серверное приложение, которое прослушивает для клиентов. Позвольте клиенту потерять подключение к Интернету и потерянное соединение с сервером.Закрытие клиентского сокета при отключении

Проверяет ли сервер, когда клиент был отключен? Если нет, то как я могу реализовать такую ​​вещь?

Main.cs http://pastebin.com/fHYpErz7

ServerSocket.cs: http://pastebin.com/erw4tzdp

Client.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Sockets; 

namespace jM2 
{ 
    class Client 
    { 
     private int clientConnectionID; 
     private Socket clientSocket; 
     private string clientIP; 
     private byte[] clientBuffer = new byte[1024]; 

     public Client(int connectionID, Socket connectionSocket) 
     { 
      clientConnectionID = connectionID; 
      clientSocket = connectionSocket; 
      clientIP = connectionSocket.RemoteEndPoint.ToString(); 
      clientSocket.BeginReceive(clientBuffer, 0, clientBuffer.Length, SocketFlags.None, new AsyncCallback(dataArrival), null); 
     } 
     public void Disconnect() 
     { 
      clientSocket.Close(); 
     } 
     private void dataArrival(IAsyncResult iar) 
     { 
      int bytesReceived = clientSocket.EndReceive(iar); 
      clientSocket.BeginReceive(clientBuffer, 0, clientBuffer.Length, SocketFlags.None, new AsyncCallback(dataArrival), null); 
     } 
    } 
} 

ответ

2

Смотрите мой ответ на этот вопрос:

TcpClient.Close doesn't close the connection

В принципе нет один знает, что я f соединение закрывается, пока вы не попытаетесь отправить данные. Если это не удается, соединение закрывается.

+0

В основном сделать функцию ping на стороне сервера для клиентов ping и, если нет ответа, просто закройте этот клиентский сокет. Верный? И что будет лучшим способом хранения клиентских сокетов? –

+4

Я бы порекомендовал, чтобы вместо выполнения функции «ping» вы всегда считали, что клиент и сервер подключены. Всякий раз, когда возникает ошибка при отправке, вы можете предположить, что они отключены. Это звучит глупо, но когда вы думаете об этом, только потому, что они были связаны 5 секунд назад, когда ваша функция ping звонила, не означает, что они теперь подключены, когда вы отправляете данные. –

+0

Я бы сохранил ваши клиентские сокеты в коллекции (вероятно, «Список '), доступный для всех участников или вашего кода обработки. Возможно свойство класса, но это зависит от остальной части вашего кода. –

0

Основываясь на том, что сказал Крис Хаас, я могу ошибаться, однако ранее я написал TCP-сервер и обнаружил закрытые соединения, когда получил 0 байт. Другими словами, в вашем методе dataArrival, если bytesReceived равен 0, это означает, что соединение было закрыто. Это, казалось, работало через довольно обширное тестирование.

Смежные вопросы