SOCKET的阻塞与非阻塞

       以SOCKET连接的connect()函数为例,如果连接不上,会产生长时间的阻塞。

解决方法:

可以将SOCKET设置成非阻塞,然后select等待返回结果,等连接上了再设置成阻塞,代码如下: 

	int iMode = 1;
	ioctlsocket(m_cmdSock, FIONBIO, (u_long FAR*) &iMode);
	struct timeval timeout;
	bool bCon = true;
	if (SOCKET_ERROR == connect(m_cmdSock,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))
	{
		FD_ZERO(&r);
		FD_SET(m_cmdSock,&r);

		timeout.tv_sec = 3;
		timeout.tv_usec = 0;

		ret = select(0,0,&r,0,&timeout);

		if (ret > 0)
		{
			getsockopt(m_cmdSock, SOL_SOCKET, SO_ERROR, (char*)(&error), &len);

			if(error  == 0) 
			{
				bCon = true;
			}
			else
			{
				bCon = false;
			}
		}
		else 
		{
			bCon = false;
		}

	}
	else
	{
		bCon = true;
	}


 

 

 

你可能感兴趣的:(SOCKET的阻塞与非阻塞)