社区
网络及通讯开发
帖子详情
使用recv函数遇到的问题
nibani
2003-01-06 09:46:48
我用WinSocket API写了一个从www服务器中获得网页内容的程序。
但在使用recv函数时遇到了如下问题:
当获取某些较小的(几百个字节到几千个字节)GIF/JPG图像文件时,
recv函数总是只能获得很少的一部分数据,
然后就阻塞(我用的是阻塞模式)。
过了一会儿recv返回0值,说获取完了。
但事实上还有大部分数据没有取得。
对html,swf等文件却没有这样的情况。
为什么呢?
有写过代理服务器程序的吗?有没有遇到这样的问题?
...全文
100
11
打赏
收藏
使用recv函数遇到的问题
我用WinSocket API写了一个从www服务器中获得网页内容的程序。 但在使用recv函数时遇到了如下问题: 当获取某些较小的(几百个字节到几千个字节)GIF/JPG图像文件时, recv函数总是只能获得很少的一部分数据, 然后就阻塞(我用的是阻塞模式)。 过了一会儿recv返回0值,说获取完了。 但事实上还有大部分数据没有取得。 对html,swf等文件却没有这样的情况。 为什么呢? 有写过代理服务器程序的吗?有没有遇到这样的问题?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
痞子酷
2003-01-07
打赏
举报
回复
你应该一个一个字节去读。
最好采用select方法。
nibani
2003-01-07
打赏
举报
回复
应该不是Buffer大小的问题。
我的Buffer比很多不能完全读取的GIF文件都大。
我写的是个Proxy,基本上不需要转换数据的。
l_clove
2003-01-07
打赏
举报
回复
我查了一下和NAT相关的资料,发现NAT在转换的时候不处理Buffer的数据,它是利用底层的网络资源管理分块数据的,而它完成的是协议头的转换工作,我感觉你的程序和NAT类似,会不会是你的浏览器不认识你的分块数据?
l_clove
2003-01-07
打赏
举报
回复
你的buffer有多大?有没有可能是buffer的长度不够,接受文本信息没问题,而接受jpg时,只是部分获取
nibani
2003-01-07
打赏
举报
回复
我连接的是sina,sohu这样的网站。
按道理是没有问题的。
程序错的有点奇怪。
我不懂电脑
2003-01-07
打赏
举报
回复
可能是你的服务器没有把数据完整地发出来。
nibani
2003-01-07
打赏
举报
回复
while(1)
{
retval = recv(sPTR,Buffer,sizeof (Buffer),0 );
if (retval == SOCKET_ERROR )
{
closesocket(sPTR);
break;
}
Len=retval;
if (Len == 0 && IsCTRClose == true)
{
closesocket(sPTR);
break;
}
if(Len!=0)
{
retval = send(sCTP,Buffer,Len,0);
if(retval == SOCKET_ERROR)
{
closesocket(sPTR);
break;
}
}
}
返回0的确表示服务器端成功的关闭了连接。
我的程序对于读取不含有图片的html文件没有问题。
为什么用同样的代码读取图片文件就有问题了呢?
上面是我的代码。
l_clove
2003-01-07
打赏
举报
回复
返回值是指获取了数据长度,而返回0是指服务器端成功的关闭了连接,是不是你的代码有这方面的问题。
l_clove
2003-01-07
打赏
举报
回复
怎么样,你只读一个图像试试?
nibani
2003-01-07
打赏
举报
回复
我试试。
l_clove
2003-01-07
打赏
举报
回复
是这样,如果你的Buffer装了一部分文本,又有一部分图像,这不就把数据分块了么(我没做过类似的东西,只能猜测一下)
网络及通讯开发
1,317
社区成员
8,874
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章