1 客户端要达到的要求,大致如下 :
while(1)
{
if (有需要向服务器发送的request)
send()
else if(没有需要向服务器发送的request)
iResult = recv(mThreadSocket, buffer, 1, MSG_PEEK); //看一下是不是从服务器收到了什么
if ( iResult<= 0 )
continue; //回到while
}
2 : 如果在阻塞模式下 , 标红的那句会阻塞, 也就是说, 线程停在那里, 即使以后其他的线程新插入了一些需要发送的request,
因为本线程阻塞在这里, 也回不到while去。
3 解决方法 : 经google, 找到这篇文章
http://www.win32developer.com/tutorial/winsock/winsock_tutorial_3.shtm
仿照其的代码, 在connnect之后加上以下2句 :
//Try connecting... if (connect(mThreadSocket, (SOCKADDR *)&target, sizeof(target)) == SOCKET_ERROR) { LogTrace( TBCAF_TRACE_LEVEL_ERROR, FWARNING"Winsock started fail." ); return ; //Couldn't connect } //set non-block model u_long iMode=1; ioctlsocket(mThreadSocket,FIONBIO,&iMode);
即可使recv函数变为不阻塞模式 。
4 备注 : 有的文章说把这一句改为
iResult = recv(mThreadSocket, buffer, 1, MSG_PEEK|MSG_DONTWAIT);
也可以,在visual studio 2005下测试, 发现是不可以的, 因为并无MSG_DONTWAIT这个标志,可能为linux独有。