windows – 当请求的缓冲区大小大于可用数据量时,为什么recv会失
TCP传输堆栈的基础是其作者有时记录的许多缓冲区限制.在WinXP SP3上,我认为我遇到了其中一个,并且无法弄清楚原因.
我已经实现了一个简单的客户端来从服务器获取数据(由Java同事编写).协议是以四个字节写入数据的长度(按网络顺序),然??后是数据.服务器以1024字节块将数据写入TCP流.客户端正确接收数据缓冲区的长度,分配内存并在循环中重复调用recv以获取所有数据: unsigned int TCP_BlockSize = 4096; unsigned int len; int result; ...code to request len... unsigned char *buf = new unsigned char[len]; if( len > TCP_BlockSize) { Uint32 currentLen = 0; result = 0; Uint32 failCount = 0; while( currentLen < len && result >= 0) { result = recv( sock,buf + currentLen,TCP_BlockSize ); if( result > 0 ) { currentLen = currentLen + result; } else { break; } } } 如果我将TCP_BlockSize设置为4095或更低,一切都很好,我可以接收多兆字节的传输.当我尝试4096个大小的接收块时,对剩余数据的最后一个请求是len-currentLen< TCP_BlockSize,总是失败,返回值为-1,并且errno = 0.我尝试了一些实验,比如修改传输数据的大小,介于815054和834246之间的某个地方,4096字节接收块的一切都在蓬勃发展. 另一个细节:服务器在发送最后一个字节后关闭套接字.这引出了一个问题,为什么不返回剩余的数据?感觉就像是一个缺陷,从recv返回-1直到流然后为空并关闭,因为当流不为空并且关闭以从recv接收-1时它是不明确的. 那么如何获取最后的数据呢? 解决方法
试试像……
to_rcv = (len - currentlen < TCP_BlockSize) ? len - currentlen : TCP_BlockSize; result = recv( sock,to_rcv); 这样最终的recv只会询问所需的金额,否则它会要求TCP_BlockSize. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Windows – 没有Aero组合的vsync无法在CreateDesktop()制作
- windows-server-2012-r2 – WDS 2012 R2服务器
- .net – 在Windows 8 DESKTOP应用程序中使用SQLite
- windows – BATCH:如何将包含’&’char的字符串回显到
- 作为Windows / Linux系统管理员,您应该完全了解哪些工具?
- windows-runtime – 如何在C/C++X中迭代IIterable?
- xaml – Windows Phone 7 – 为所选ListBoxItem中的特定控件
- Windows下Mongodb安装部署
- Jmeter安装及配置(傻瓜模式)
- 安装Windows Server 2008
- 如何用R获取Windows机器的磁盘空间?
- powershell – 如何在Add-AzureAccount中使用Mic
- windows-server-2008 – 使用Firefox / Chrome从
- windows-7 – 完全使用PowerShell停止“资源管理
- windows – 如何衡量远程桌面性能?
- caffe了(window官方版win7+VS2013)
- Win7程序运行出现Windows Based Scrip Host 已停
- windows-7 – Windows 7 VPN是否可与Cisco ASA 5
- windows – 从命令行确定计算机的登录域
- windows – 如何让iCacl在文件夹级别授予访问权限