2011-02-18 175 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客戶端,如果沒有響應就關閉客戶端套接字。正確?另外什麼是存儲客戶端套接字的最佳方式? – 2011-02-18 20:54:32

0

根據Chris Haas的說法,我可能是錯的,但是我之前編寫了一個TCP服務器,並在收到0字節時檢測到了關閉的連接。換句話說,在您的dataArrival方法中,如果bytesReceived爲0,則表示連接已關閉。這似乎通過相當廣泛的測試工作。