有段关于网络的代码中的疑问

shn521 2011-06-25 09:43:11
ioctlsocket(sClient,FIONBIO,(unsigned long *)&ul);//设置非阻塞 struct timeval timeout;
fd_set r;
int ret;
FD_ZERO(&r);
FD_SET(sClient,&r);
timeout.tv_sec=3;//表示3秒
timeout.tv_sec=0;//表示0微秒
ReturnVal=connect(sClient,(struct sockaddr *)&server, sizeof(SOCKADDR_IN));
for(int k =0; k<3; k++)
{
::Sleep(1);
ret = select(0,0,&r,0,&timeout);
if(ret<=0)
::Sleep(1000);
else
break;
}



if(ret==1)
{

ul =0;//阻塞模式
ioctlsocket(sClient,FIONBIO,(unsigned long *)&ul);////阻塞模式 ::setsockopt (sClient, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof (optval));
GetDlgItem(IDC_STARTNETRECV)->EnableWindow(1);

GetDlgItem(IDC_STOPNETRECV)->EnableWindow(1);
GetDlgItem(IDC_CloseNetLink)->EnableWindow(1);
GetDlgItem(IDC_SetupNetLink)->EnableWindow(0);
pStatus->SetPaneText(1, "网络已连接");

}
else
{
::closesocket(sClient);
AfxMessageBox("连接超时",MB_OK);
return;
}
为什么设置完非阻塞又设置成阻塞了
...全文
43 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishion 2011-06-25
  • 打赏
  • 举报
回复
设置了阻塞后,recv就会一直等待数据。如果设置了非阻塞,你要接收数据时就要用死循环来检测recv的返回值看看数据到了没
shn521 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ouyh12345 的回复:]
如果不阻塞,而connect又很久,则消息被阻塞了,界面不能动
[/Quote]
感谢啊,那对后面的recv会不会有影响呢
ouyh12345 2011-06-25
  • 打赏
  • 举报
回复
如果不阻塞,而connect又很久,则消息被阻塞了,界面不能动
ouyh12345 2011-06-25
  • 打赏
  • 举报
回复
这段代码的目的就是在connect过程中,可以进行某些控制,而不是一直阻塞

18,356

社区成员

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

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