BSD socket 非阻塞模式连接,适用用各种实现BSD socket的操作系统:windows, linux, unix, ios, android.
int CNetTcpC::StartConnect(LPCSTR pszIPAddr, UINT nPort)
{
SOCKADDR_IN ctrl_sin;
UINT sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
ctrl_sin.sin_family = AF_INET;
ctrl_sin.sin_addr.s_addr = inet_addr(m_szSvrIP);
ctrl_sin.sin_port = htons(m_uiSvrPort);
bzero(&(ctrl_sin.sin_zero), 8);
int flag = fcntl(sock, F_GETFL, 0);
fcntl(sock, F_SETFL, flag | O_NONBLOCK);
struct timeval tmout;
tmout.tv_sec = 10;
tmout.tv_usec = 0;
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &tmout, sizeof(tmout));
int err = connect(sock, (SOCKADDR*)&ctrl_sin, sizeof(ctrl_sin));
printf("Connect error no is %d:\r",err);
//设置select超时时间间隔
fd_set fdwrite;
struct timeval tvSelect;
FD_ZERO(&fdwrite);
FD_SET(sock, &fdwrite);
tvSelect.tv_sec = 10;
tvSelect.tv_usec = 0;
int retval = select(sock + 1,NULL, &fdwrite, NULL, &tvSelect);
printf("select error no is %d:\r",retval);
if ( retval <= 0 )
{
close(sock);
sock = INVALID_SOCKET;
return FALSE;
}
//在connect成功之后,设成阻塞模式
flag = fcntl(sock, F_GETFL,0);
flag &= ~ O_NONBLOCK;
fcntl(sock, F_SETFL, flag);
return TRUE;
}