setsockopt函数设置recv缓冲区后仍然堵塞,请大牛帮忙。。

qazw_12345 2013-02-21 04:19:52
小弟程序里用setsockopt函数设置recv缓冲区后仍然堵塞,百思不得其解。。请大牛帮忙看看改怎么改。。谢谢。。。。
BOOL RecvData(SOCKET s,char*data,int len)
{
char *pData=data;
int iLeftRecv=len;
int iRet=0;
int iHasRecv=0;
if(len<=0)
{
return TRUE;
}


while(1)
{
int nRecvBuf=128*1024;//设置为128K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
iRet=recv(s,pData,iLeftRecv,0);
if(iRet==0||iRet==SOCKET_ERROR)
{
return FALSE;
}
iHasRecv+=iRet;
iLeftRecv-=iRet;
pData+=iRet;
if(iHasRecv>=len)
break;
}
return TRUE;


}
...全文
259 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
么特里亚 2013-11-12
  • 打赏
  • 举报
回复
遇到同样的问题了,不知lz最后怎么解决的
LLionTree 2013-03-02
  • 打赏
  • 举报
回复
使用setsockopt设置的是监听套接口的缓冲区大小,已连接套接口继承自监听套接口。你这样设置是没用的。可以翻下Unix网络编程卷1 看看,里面有。
sdchenchen2012 2013-02-22
  • 打赏
  • 举报
回复
引用 3 楼 cheng7068 的回复:
这个函数是设置套接字选项,分配接收与发送缓冲区,与堵塞、非堵塞关系不大,LZ还是看看别人在非阻塞模式编码部分的代码,参考一下比较好
怎么没关系
qazw_12345 2013-02-21
  • 打赏
  • 举报
回复
大哥,我用setsockopt增加RECV的缓冲区大小到128K,但在DEBUG到recv(s,pData,1880,0);时返回SOCKET_ERROR,我用getlasterror捕获SOCKET错误代码10053(0X2745您的主机中的软件放弃了一个已建立的连接),难道是1880太大了?请大哥赐教。。。。谢谢啊。。。
风行踩火轮 2013-02-21
  • 打赏
  • 举报
回复
这个函数是设置套接字选项,分配接收与发送缓冲区,与堵塞、非堵塞关系不大,LZ还是看看别人在非阻塞模式编码部分的代码,参考一下比较好
sdchenchen2012 2013-02-21
  • 打赏
  • 举报
回复
引用 1 楼 yang79tao 的回复:
缓存区与阻不阻塞有什么关系?
有关于,如果套接字是堵塞的, 接受缓冲区过小,就会堵塞 如不是堵塞的,那么就会返回错误码
youngwolf 2013-02-21
  • 打赏
  • 举报
回复
缓存区与阻不阻塞有什么关系?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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