2011-10-22 79 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不是。 –