多年前遇到的问题:在 编写IE 的 ActiveX 插件,有个功能是 传递文件给 Java 服务器。
当时要求自己读取指定文件,然后用 Socket 发送,ip,port 也由 ActiveX 暴露的方法参数列表中指定。
当时约定的细节就是,我发送一段数据包,服务端收到后给我返回一个【确认】包。
问题就是在我写完后,Java方发现文件最后一部分一直传不上来,Java方面一直在等待。
经过调试诊断,发现我方也一直在等待服务器的【确认】。最后得出结论,我最后一个 send 函数调用成功,但是数据应该还在本机,没有通过网络发送出去。
最后没办法,加了一个【推送】类型数据包,啥作用也没有,就是为了“推送前一个数据包出去”,最后一个send【推送】包后,直接关闭 socket。
当时水平低,也没有在其他机器环境上进行各种试验,所以到现在也不知道最根本的原因和最优解决方式是什么。
● 之后也看过一些框架库,看他们初始化的时候,也没什么特殊操作,过后怀疑可能是没有设置 心跳 keep alive 的问题,可惜没法验证了
● 前些日子,看到一个提及 Nagle 算法的帖子,结合各个回复,总结如下:1.禁用nagle. 2.设置0 sndbuf缓冲区
记录下来,期待以后再遇到再验证了……