2013-05-27 82 views
2

我已經創建了一個小型應用程序,它將數據從客戶端記錄到服務器。我想從任務信使中退出應用程序時獲取客戶端應用程序的狀態。我如何獲得客戶身份。套接字編程c#窗口應用程序

就像在Skype中。

我用戶退出skype表單任務信使另一個用戶的skype表示註銷了此用戶。

回答

1

您可以讓客戶端定期發送小心跳。如果這些心跳停止了,你就知道客戶端已經關閉了(進程被終止,應用程序關閉,計算機關閉,網絡連接斷開等等)。

+0

謝謝安德烈亞斯!我腦海裏也有同樣的想法。另一個應用程序使用所有客戶端IP進行ping操作,並且如果發出任何請求,它仍然超時。有沒有最快的方法,這樣可能不會減慢應用程序和服務器的性能。 –

+0

難題!我只能在心跳期間警告數據庫連接。確保你沒有鎖定整個表,避免陷入死鎖等。 – Andreas

+0

我通過套接字編程自己做了。就像在簡單的聊天應用中一樣。 –

0

你不能捕獲So​​cketException並且檢查接收零字節。如果您收到零字節,則另一方清楚地關閉連接。如果你將SocketErrorCode設置爲ConnectionReset時發生SocketException,那麼你也可以假設另一端不見了。唯一不能接受的是半開放式連接。爲此,你需要一些像Andreas所建議的保持活力的數據包。

+0

SocketException非常不可靠,只有在發送到客戶端時纔會得到它,通常您不會這樣做(服務器只響應客戶端請求)。你不想保持連接打開,只有這麼多的併發連接,你可以擁有 – Andreas

+0

@Andreas。一點也不。我在socket.Receive()方法上得到了很多。同樣在一些協議中,客戶端或服務器可以發起保活分組。如果請求以異步方式響應,則服務器將啓動通信。 – uriDium

+0

我已經通過Socket socketForClient = tcpListener.AcceptSocket();讓異形處理的電腦被處理。無論如何感謝您的意見。 –