WinSocket中recv函数的问题

nibani 2003-01-06 09:40:02
我用WinSocket API写了一个从www服务器中获得网页内容的程序。
但在使用recv函数时遇到了如下问题:
当获取某些较小的(几百个字节到几千个字节)GIF/JPG图像文件时,
recv函数总是只能获得很少的一部分数据,
然后就阻塞(我用的是阻塞模式)。
过了一会儿recv返回0值,说获取完了。
但事实上还有大部分数据没有取得。
对html,swf等文件却没有这样的情况。
为什么呢?
有写过代理服务器程序的吗?有没有遇到这样的问题?
...全文
119 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
SuperFC 2003-02-10
  • 打赏
  • 举报
回复
对tcp/ip来说有一个窗口大小问题,接收端会对窗口大小进行调节;
所以,我想你的程序可能应该成下面这个模式:
char rec[4096];
int ret,nLeft,nIndex;
nLeft = 4096;
nIndex = 0;
while( nLeft > 0 )
{
ret = recv(s, &rec[nIndex], nLeft, 0)
if( ret == SOCKET_ERROR)
{
printf("errror\n");
exit(1);
}
nIndex = nIndex + nLeft;
nLeft = nLeft - ret;
}//while

gold_stone 2003-01-08
  • 打赏
  • 举报
回复
你没有必要用循环等待再break;read()函数需要有时间参数,因为阻塞模式需要等待再次发送,如果超时将返回空值。
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;
}
}
}
这是有关的代码。该怎么改?
Nepton 2003-01-07
  • 打赏
  • 举报
回复
把程序贴出来!
肯定是你的程序错了
nibani 2003-01-07
  • 打赏
  • 举报
回复
GIF/JPG文件中有回车换行符吗?
如果有,应该怎么避免?
xysome 2003-01-06
  • 打赏
  • 举报
回复
如果碰到回车换行符,就停止

4,387

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧