2011-10-22 60 views
5

我在寫一個數據庫庫,它必須智能地支持超時。現在,我期待在連接池,我特別擔心以下情形:如何防止對TCP套接字的延遲迴復?

  1. 發送查詢#1
  2. 超時ň秒後。
  3. 發送查詢#2
  4. 接收到查詢#1

第四步可能發生的響應,因爲查詢不與查詢ID標記:我所知道的是我收到的響應,我不知道它屬於哪個查詢。有人可能會認爲這在協議中構成了一個錯誤,但這不是我所能做到的。

在發送查詢#2之前,我該怎麼做才能避免這樣的延遲迴復?是唯一正確的方法shutdown(),close()connect()

+2

怎麼樣增加常量來選擇所有查詢,以便您能庫識別查詢的響應是? – T3hc13h

+0

這是一個好主意,但可惜對圖書館來說不是很好。也許通過一個插件... –

回答

3

恐怕這是操作連接的唯一安全方式,因爲沒有其他方法可以通過TCP在問答之間獲得一對一的關係。似乎缺乏某種類型的取消功能之間的某種

該參考提供了更多的啓示:http://www.ssfnet.org/Exchange/tcp/tcpTutorialNotes.html

+0

反過來,這是因爲TCP不知道你所謂的「查詢」,「響應」或「取消」。一個連接的插座只是兩個字節的單向管(Ted​​ Stevens是對的)。如果一個人寫東西,而小河不上升,那麼另一端可以讀取它。因此,建立什麼「查詢」「響應」是「for」是應用程序級別的問題。它可以嵌入到定義查詢/響應的協議中,也可以不存在。 –

+0

我的意思是,我知道。 :-)但是TCP確實有序列號,所以我希望有某種我可以利用的技巧。 –

+0

@Andres:不幸的是,序列號只是讓TCP層組裝流 - 沒有什麼可以說相反方向上的特定字節之間經過了多少時間。請記住,僅僅因爲您發送第一個請求後經過了「n」秒,並不意味着自從另一端讀取它以來經過了「n」秒。所以另一端可能會在它的POV超時之前發送這個響應*,但它會在你的POV超時之後到達。超時本身可以與可靠的時間同步連接一起工作,而TCP不是。 –