首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络协议 >

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

2012-12-30 
关于socke的阻塞模式和非阻塞模式各位大侠新年好。。。最近在学习socket通信, 其中socket的阻塞通信和非阻塞

关于socke的阻塞模式和非阻塞模式
各位大侠新年好。。。最近在学习socket通信, 其中socket的阻塞通信和非阻塞通信 实在让小弟费解,求各位大侠给个TCP Socket阻塞通信、非阻塞通信,和UDP Socket阻塞通信、非阻塞通信的 解释,最好能给小弟给个实例。。

谢谢各位。
[解决办法]
假设掉用一个函数,去执行一些运算,需要花比较久的时间。

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

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


- 千里孤行
[解决办法]
阻塞: 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);
}



热点排行