断开连接时关闭客户端套接字

问题描述:

我有监听客户端的服务器应用程序。 让我们的客户端失去了互联网连接,并失去与服务器的连接。断开连接时关闭客户端套接字

服务器自动检查客户端何时断开连接?如果不是我怎么能实现这样的事情?

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

见我回答这个问题:

TcpClient.Close doesn't close the connection

基本没有人知道我f连接关闭,直到您尝试发送数据。如果失败,则连接关闭。

+0

基本上在服务器端进行ping功能来ping客户端,如果没有响应就关闭客户端套接字。正确?另外什么是存储客户端套接字的最佳方式? – 2011-02-18 20:54:32

根据Chris Haas的说法,我可能是错的,但是我之前编写了一个TCP服务器,并在收到0字节时检测到了关闭的连接。换句话说,在您的dataArrival方法中,如果bytesReceived为0,则表示连接已关闭。这似乎通过相当广泛的测试工作。

我推荐一种“轮询”或“心跳”消息,as described here