【发布时间】:2011-07-15 20:32:07
【问题描述】:
我正在尝试降低非阻塞 TCP 套接字上的发送缓冲区大小,以便可以正确显示上传进度条,但我看到了一些奇怪的行为。
我正在创建一个非阻塞 TCP 套接字,将 SO_SNDBUF 设置为 1024,验证设置是否正确,然后连接(在调用连接之前和之后尝试此操作没有区别)。
问题是,当我的应用程序实际出现并调用 send(发送大约 2MB)而不是返回大约 1024 个字节已发送时,send 调用显然接受所有数据并返回 2 MB 的发送值(究竟是什么我通过了)。一切正常(这是一个 HTTP PUT,我得到了响应等),但我最终在进度条中显示的是上传以 100% 的速度放置了大约 30 秒,然后响应进来了。
我已经验证,如果我在收到响应之前停止,则上传不会完成,所以它不像它只是上传得非常快然后服务器停止了......有什么想法吗? windows甚至会看这个设置吗?
【问题讨论】:
-
SO_SNDBUF 是发送缓冲区的最大大小......尝试使用 1 kB 缓冲区一次发送 2MB 对我来说听起来有点奇怪。您可能应该将发送缓冲区增加到 2 MB 以上或使发送小于 1kb。我认为您错误地认为设置 SO_SNDBUF 会将您的 2 MB “剪切”为 1 kB 段并一一发送,您需要自己做。
-
我的印象是它应该限制可以随时排队的数据量,对吧。基本上我只需要一个指示实际传输了多少数据(而不是排队)。缓冲区的大小与我并不真正相关,我只是想选择足够小的东西,以便我应该看到一些粒度。有一个更好的方法吗? HTTP 没有任何内置的中间上传 ACK afaik。
-
是的,就是这样。如果只能排队 1kB,则无法发送 2MB。为什么它假装它确实发送了 2 MB 是另一个问题。请记住,无论您做什么,TCP 都可以很好地在您背后合并或拆分您的数据包(请参阅 Nagle)。您应该自己拆分发送,我想在您的情况下应该在 10 到 50 kB 之间。要查看正在进行的上传,请使用 Wireshark 或 Fiddler2 等代理。
标签: tcp buffer send nonblocking