关于socke的阻塞模式和非阻塞模式

yp1987320 2011-02-12 11:51:06
各位大侠新年好。。。最近在学习socket通信, 其中socket的阻塞通信和非阻塞通信 实在让小弟费解,求各位大侠给个TCP Socket阻塞通信、非阻塞通信,和UDP Socket阻塞通信、非阻塞通信的 解释,最好能给小弟给个实例。。

谢谢各位。
...全文
171 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ga6840 2011-02-14
  • 打赏
  • 举报
回复
阻塞: blocked 或者叫 pending

比如一个接收函数 a() ,现在执行到a(); ,阻塞模式下 a() 一直不返回(去执行下一句) ,会一直等待,直到他接收到东西后就返回 去执行下一句 ,而非阻塞 的 a() 执行后就返回 无论他执行时是否接到 数据.

我这只是最通俗的理解,只希望帮助你理解! 班门弄斧了
yanghehong的解释就是你可以参考的

另外 我确切知道的 对于WinSock UDP (Windows Sockets v1.1 ):默认情况下recvfrom是阻塞的
你可以通过:

int iMode = 1;
ioctlsocket(lo_Socket,FIONBIO, (u_long FAR*) &iMode);

设置recvfrom为非阻塞 (设置一次就行了)

设置后,因为是非阻塞的,所以你至少应在一个循环里 不断地接收 ,类似:


while(1)
{
EnterCriticalSection(&g_cs);

lo_RecvLen = recvfrom((*g_pRecvSocket),lo_Buff ,ASSUME_MTU,0,
(sockaddr*)&lo_AddrBuff, &lo_alen);
if(lo_RecvLen > 0)
{
lo_Buff[lo_RecvLen] = '\0';
cout<<"Has recved:"<<lo_Buff<<" from "<<inet_ntoa(lo_AddrBuff.sin_addr);
cout<<"/"<<ntohs(lo_AddrBuff.sin_port)<<endl;
}else if(WSAEWOULDBLOCK != WSAGetLastError())
{
Sleep(200);
cout<<"Recving WSAGetLastError:"<<WSAGetLastError()<<endl;
}

LeaveCriticalSection(&g_cs);
Sleep(100);
}



yanghehong 2011-02-13
  • 打赏
  • 举报
回复
假设掉用一个函数,去执行一些运算,需要花比较久的时间。

你调用它,它开始执行,经过那么久以后,它执行完,然后函数调用返回计算结果,代码再继续往下执行,这就是 阻塞式的调用。

如果你调用它,它开始执行,函数调用立刻返回,代码再继续往下执行,这就是 非阻塞。至于函数计算的结果,会在计算完后某个时刻,通过别的方式,比如调用另外一个你定义好的函数告诉你(常称为回调函数),或是发个什么消息/信号给你。


- 千里孤行
yp1987320 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yanghehong 的回复:]
引用楼主 yp1987320 的回复:
各位大侠新年好。。。最近在学习socket通信, 其中socket的阻塞通信和非阻塞通信 实在让小弟费解,求各位大侠给个TCP Socket阻塞通信、非阻塞通信,和UDP Socket阻塞通信、非阻塞通信的 解释,最好能给小弟给个实例。。

谢谢各位。


其实socket的和其他调用的阻塞 非阻塞含义是一样的。
你如果理解了一般调用的 阻塞 ……
[/Quote]

我就是不理解一般调用的 阻塞 非阻塞的含义。。。。大哥能给解释下嘛。。。。。我在这部分分不清楚啊
yanghehong 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 yp1987320 的回复:]
各位大侠新年好。。。最近在学习socket通信, 其中socket的阻塞通信和非阻塞通信 实在让小弟费解,求各位大侠给个TCP Socket阻塞通信、非阻塞通信,和UDP Socket阻塞通信、非阻塞通信的 解释,最好能给小弟给个实例。。

谢谢各位。
[/Quote]

其实socket的和其他调用的阻塞 非阻塞含义是一样的。
你如果理解了一般调用的 阻塞 非阻塞,应该就理解了。

- 千里孤行
dengzikun 2011-02-12
  • 打赏
  • 举报
回复
用ioctlsocket设置socket阻塞与否。
yp1987320 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dengzikun 的回复:]
ioctlsocket()
[/Quote]

仁兄能说的详细点嘛?
dengzikun 2011-02-12
  • 打赏
  • 举报
回复
ioctlsocket()

4,356

社区成员

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

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