2017-09-14 21 views
0

我對socket編程的瞭解主要來自本教程:如何使用套接字操作通知有關不響應的TCP服務器?

CS 50 Software Design and Implementation, Lecture 19, Socket Programming

由於在客戶端和服務器在兩個不同的系統和代理運行的TCP客戶機/服務器模型是在它們之間,假設客戶端可以通過代理將消息發送到服務器,然後服務器突然變得不響應(說它被重置)。代理和服務器之間的連接會發生什麼,以及如何處理?

我的意思是,我可以採用什麼技術來檢測這樣的事件,關閉我的連接,並向客戶端返回錯誤消息?

我能想到的一種方法是檢查代理中的接收緩衝區,如果一段時間內沒有數據,告訴客戶端服務器已關閉。但我認爲超時是一種原始的方法。在套接字編程中是否有已知的標準方法或替代方案?

+1

您正在實施客戶端,服務器還是代理?無論哪種方式,TCP都有一個可以啓用的內置保持活動心跳。根據您運行的平臺,您可以使用'setsockopt(SOL_SOCKET,SO_KEEPALIVE)'或'setsockopt(SOL_TCP,TCP_KEEPCNT/TCP_KEEPIDLE/TCP_KEEPINTVL)'或'WSAIoctl(SIO_KEEPALIVE_VALS)'。如果心跳失敗,連接消失,所以請關閉您的套接字句柄。 –

+0

「_提供TCP客戶端/服務器模型..._」TCP沒有客戶端或服務器。客戶機/服務器模型是一個應用程序層模型。 TCP建立對等主機之間的連接。 –

回答

0

給出一個TCP客戶機/服務器模型,其中客戶端和服務器在兩個不同的系統上運行和代理在他們之間,假定客戶端能夠通過代理將消息發送到服務器,然後服務器突然變得沒有反應(說它被重置)。恰好代理和服務器

無論之間的關係是什麼:

  1. 沒有。
  2. 一個讀取超時,或
  3. 一個「連接重置」錯誤

完全依靠什麼代理做根據。如果它正在接收,(2)或(3)是否已經有待處理的發送。如果它正在發送,(3),但不是第一次發送,因爲緩衝。最終發送會導致(3)。

以及如何處理?

關閉連接,並連接到客戶端。如果是重置,您可能需要通過一種技術將其傳播給客戶端,因爲這種技術被廣泛濫用,所以我不會在這裏記錄。如果它是一個讀取超時,你甚至可能想通過簡單地做五分鐘或任何適當的事情來將其傳播給客戶端,然後關閉或重置連接。

我的意思是,我可以採用什麼技術來檢測這樣的事件,關閉我的連接,並向客戶端返回錯誤消息?

參見上文。

我能想到的一種方式是檢查代理中的接收緩衝區,如果一段時間內沒有數據,告訴客戶端服務器已關閉。但我認爲超時是一種原始的方法。

不是。

是否有任何已知的標準方法或替代方案可用於套接字編程?

參見上文。

+0

感謝您的回答,但我會爲知識而感激「通過一種技術,我不會在這裏文檔,因爲它是如此廣泛的濫用」,如果你可以參考任何材料或網頁鏈接,我可以採取一個潛行的高峯比你直接提到它。即使它的2000頁的書和答案在那裏,我不會介意挖掘出來。如果你感覺舒服,我甚至可以爲你提供我的郵件編號。 – achoora

+0

您需要查閱SO_LINGER並設置零超時。 – EJP

相關問題