2011-08-31 38 views
0

我的应用程序充当银行服务器的客户端,发送请求并从该服务器获取响应。在数据库中完成响应处理需要一些时间,所以如果服务器在0.5秒内发送响应并且数据库操作需要1秒,之后只有我的应用程序再次尝试通过开始接收来从服务器接收数据,那么数据应该在某处积累,如果是的,它将被存储在哪里。是否会有一些限制,使数据溢出,并且是否会关闭此套接字。我宣布我的套接字缓冲区大小为1024.如果有人也有一些文章清楚我的疑惑,请分享。TCP套接字缓冲区和数据溢出

+0

为什么你不测试它? – Carsten

+0

我已经测试过,发现即使应用程序运行速度很慢,但如果我的缓冲区大小只有1024位,我想要将这些数据存储在哪里 – funsukvangdu

+0

要么放大缓冲区大小,要么将其存储在自己的缓冲区中,或者甚至更好地找出原因你对数据库的更新需要很长时间 – Carsten

回答

1

你能控制服务器发送给你的东西吗?在大多数情况下,当接收机对接收到的数据进行操作时,完成工作后发送应用级ACK将允许发送方知道何时发送下一个请求。这将确保没有数据丢失(因为TCP将确保它不会在网络中丢失)。

如果您无法更改服务器向您发送数据的方式,则可以考虑在不同的线程中运行接收器,以便将每个传入请求保存到缓存中(只在RAM中或HD中)。然后,一个工作者线程(或多个线程)将读取来自该缓存的请求并完成您需要的工作。这样你就可以完全控制数据的缓冲。

+0

我同意你的看法,但我唯一的疑问是如果我没有任何控制权服务器和它的发送速度远远大于客户端接收速度(这可能不会发生,但只是我需要澄清)所以会发生什么。数据是否会在tcp中溢出并丢失,如果丢失,是否会关闭套接字或者它会一直保留在那里,直到客户端读取所有数据。 – funsukvangdu

+0

OS套接字层有一个内部缓冲区。它的大小可以通过'ReceiveBufferSize'属性来控制。如果此缓冲区已满,它将覆盖旧数据或删除新数据。如果套接字被数据仍在缓冲区中关闭,您仍然可以读取数据(因为TCP套接字关闭仅用于发送)。 –

0

我想你会用Socket自己读取数据块 - 不是吗?不仅仅是阅读的内容比你能处理的要多。发件人应该这样做 - 如果您的输入缓冲区溢出,发件人应该在发送更多内容之前等待。但是在这种情况下可能会出现错误。如果这真的是一个大问题,那么首先将数据下载到磁盘上的文件中,并在完成所有操作后处理数据。我不认为你的硬盘会比你的网络慢:)

+0

我同意你,但我唯一的疑问是,如果我没有任何控制服务器和它的发送速度远远大于客户接收速度(可能不会发生,但只是我需要澄清),那么会发生什么。数据是否会在tcp中溢出并丢失,如果丢失,是否会关闭套接字或者它会一直保留在那里,直到客户端读取所有数据。 – funsukvangdu

+0

这将取决于您的客户端和服务器 - 如果服务器在发送软件包后没有检查/等待,这些位可能会在*空间中的某处丢失* - 但不要担心:如果先保存到硬盘,然后在您身边不会有什么大问题 - 你的速度就够了,所有其他讨厌的细节都由网络基础设施来处理;) – Carsten