2014-01-27 48 views
0

幾個星期前,我寫了一個小程序,它創建了一個到apache webserver的套接字併發出請求。
當時我並不知道這個Web服務器有一個5秒的KeepAliveTimeout。
我第一次請求後,我等了1分鐘。在此之後,我想重新使用我的第一個套接字作爲另一個web服務器請求,但出現錯誤。tcp和apache keepalivetimouts

從「Beej指南網絡編程」(http://beej.us/guide/bgnet/output/html/multipage/syscalls.html#sendrecv)我知道,如果recv的返回0,然後對方已經關閉了連接:

Wait! recv() can return 0. This can mean only one thing: the remote side has closed 
the connection on you! A return value of 0 is recv()'s way of letting you know this 
has occurred. 

我的問題,現在是:

是什麼在KeepAliveTimeout結束時發送Apache - FIN或RST數據包?

我知道在這種情況下使用tcp連接處理2個不相關的http請求,可能是 不是最好的。但爲了更多地理解tcp,下一個問題是:

在我第一次成功的http請求之後,在通過同一個套接字發送下一個http請求之前,會不知何故有可能獲知有關keepalivetimeout tcp套接字終止的消息服務器除了從下一個recv()調用接收0?

非常感謝提前
沃爾夫岡

回答

2

它將發送一個FIN。如果在此之後向服務器寫入請求,則send()將返回-1,並返回errno/WSAGetLastError()= ECONNRESET。

1

會有莫名其妙的可能性,通過讀取適當的響應頭參數,以獲得瞭解服務器

是這樣的KeepAliveTimeout TCP套接字終止,即Keep-Alive: timeout=delta-seconds

'timeout'參數

主機將timeout參數的值設置爲ti我認爲主機將允許空閒連接在關閉之前保持打開狀態。如果沒有數據由主機發送或接收,則連接處於空閒狀態。

timeout參數的值是以秒爲單位的單個整數。

主機可以保持一個空閒連接的打開時間超過它指示的時間,但它應該嘗試保留連接的時間至少與指示的一樣長。

正如您所看到的,由主機決定。鑑於它只有應該試圖保持連接打開,只要承諾,但它並不要求它確實爲了符合規範,所以服務器可能決定關閉並重新使用連接來服務另一個待定客戶。