2013-08-28 45 views
3

我正在創建一個客戶端服務器應用程序。服務器已經在設計並且在等待來自客戶端的連接。現在,在客戶端部分中,我希望在應用程序的整個生命週期中保持連接的活動狀態,並且只有在主客戶端應用程序關閉或關閉或服務器關閉時纔會關閉連接。Tcp連接保持活着

目前每10秒服務器關閉TCP connection.I試圖與

socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.KeepAlive, true); 

,但它不爲我工作.. 下面是我的代碼塊

public TCPStreamDevice(string RemoteIPAddress, int RemotePort, string SourceIPAddress, int SourcePortNo)   
{ 
    mIpAddress = RemoteIPAddress; 
    mPort = RemotePort; 

    mClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    System.Net.IPEndPoint LocalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse(SourceIPAddress), SourcePortNo); 

    mClient.Bind(LocalEndPoint); 

    mDataReceivedCallback = new AsyncCallback(DataReceivedTCPCallback_Handler); 
    mBuffer = new byte[1024]; 
    Description = new DeviceDescription(); 
} 

,並在處理程序我有:

private void DataReceivedTCPCallback_Handler(IAsyncResult ar) 
{ 
    try 
    { 
     Socket client = (Socket)ar.AsyncState; 
     int bytesReceived = client.EndReceive(ar); 

     if (bytesReceived > 0) 
     { 
      //to know transport level errors 
      //EngineInterface.reponseReceived(mBuffer, false); 

      ReceiveCallBackFunc(mBuffer, bytesReceived); 

      client.BeginReceive(mBuffer, 0, 1024, SocketFlags.None, DataReceivedTCPCallback_Handler, client); 
     } 
     else 
     { 
      //disconnect 
      /* when there is no datapacket means no TCP connection is alive now (how can i keep Tcp alive here) */ 
     } 
    } 
} 
+1

這可能是服務器關閉連接。當超時超時時,除了在10秒內發送一些數據外,您無法做任何事情。接收到的0字節意味着另一端斷開。 –

+0

有什麼方法可以通過它來重新啓動TCP會話? –

+0

您必須在需要時重新連接。對於重載服務器,這是常見的行爲。 –

回答

1

該評論(「有沒有datapacket意味着沒有TCP連接「)放在您從另一端收到斷開連接(0字節)數據包的地方。有沒有辦法讓連接活着,因爲對方據法權產將其關閉。

如果連接被關閉,由於網絡問題,你要麼得到一個異常,否則會看起來好像連接是有效的,但安靜。

保持有效機制總是超時工作一起 - 超時強制執行「如果x秒沒有收到數據,關閉連接」裏的保活只需發送僞數據包,以保持超時的發生。

通過實施自己的協議(你在TCP/IP級別操作),你只需要實現保活,如果你已經有了對對方實施了暫停。

+0

如何實現保持活着的計時器?你能否幫我解決這個問題..我試着用一些教程保持活力..他們不工作 –

2

的意見,回答以上是有效的 - 聽起來像一個糟糕的設計選擇有打開的應用程序的整個生命週期的插座,並希望事情能正常工作 - 你應該建立某種故障安全機制的情況下,連接得到下降。

返回保留消息:你需要他們在攻防兩端 - 服務器和客戶端,以便檢查插座如何設置在兩側。我認爲keep alive的默認值是2個小時 - 這是等待keep-alive數據包的很長時間,但它可以改變。檢查Socket.IOControl方法並使用IOControlCode.KeepAliveValues,其結構看起來像這樣(非託管)http://msdn.microsoft.com/en-us/library/ms741621.aspx。有關控制代碼的更多信息,請參考:http://msdn.microsoft.com/en-us/library/system.net.sockets.iocontrolcode.aspx

6

在調用SetSocketOption()KeepAlive是無效的SocketOptionLevel.Tcp水平,而是使用SocketOptionLevel.Socket

SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);

+0

你也應該爲套接字設置'keepalivetime'和'keepaliveinterval'設置。搜索'SetSocketKeepAliveValues'和'SetTcpKeepAlive' –