windows的socket在创建后,默认是阻塞调用的,也就是说函数recv,recvfrom,send,sendto等函数都是阻塞的;那么我们如何将他们设置成非阻塞调用呢?我们可以通过windows为我们提供的ioctlsocket 函数实现;
CSocket类中的connect等函数都是默认为阻塞方式的,也就是说,它不达到目的就不走,在程序中就会出现像死机一样的状况,很是不爽。在这里给出一种设置connect函数为非阻塞方式的方法,代码很简单,且慢慢来看。
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);//先创建套接字
if(sock == INVALID_SOCKET)
{
AfxMessageBox("创建套接字失败!");
return 0;
}
SOCKADDR_IN addrTo;
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(4000);
addrTo.sin_addr.S_un.S_addr=inet_addr(ip);
//--------------------------------------------------------------------------
//设置为非阻塞方式连接
unsigned long ul = 1;
int err;
int ret = ioctlsocket(sock, FIONBIO, (unsigned long*)&ul);
if(ret == SOCKET_ERROR)
{
err = WSAGetLastError();
closesocket(sock);
sock = NULL;
return FALSE;
}
TIMEVAL timeval;
fd_set r;
FD_ZERO(&r);
FD_SET(sock, &r);