关于socket设置为非阻塞式出现的有关问题

关于socket设置为非阻塞式出现的问题
我一加上ret = ioctlsocket(sock, FIONBIO,(unsigned long *)&ul);这行代码后,connect就出错了,我想把这个socket设置为非阻塞的,请问如何做啊,谢谢


 WSADATA wsaData;
 SOCKADDR_IN server_addr;
 WORD wVersion;
 wVersion = MAKEWORD(2,2);
 /*初始化socket资源*/
 WSAStartup(wVersion, &wsaData); 

 
 //获取长度
int len = WideCharToMultiByte(CP_ACP, 0, ip_p, ip_p.GetLength(), NULL, 0, NULL, NULL); 
char * cip = new char[len + 1]; 
memset(cip, 0x00, len + 1);
//宽字节转多字节
WideCharToMultiByte(CP_ACP, 0, ip_p, ip_p.GetLength(), cip, len, NULL, NULL); 
//cip[len+1] = '\0'; 


 //server_addr.sin_addr.s_addr = inet_addr(tmpData);
 server_addr.sin_addr.s_addr = inet_addr(cip);
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(_ttoi(port_p));
 if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
 {
 //create socket error
 check = false;
 }
 unsigned long ul = 1;  
 int ret;  
 ret = ioctlsocket(sock, FIONBIO,(unsigned long *)&ul);//设置成非阻塞模式。
 if (connect(sock, (struct sockaddr *) &server_addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
 {
  //connect error
  check = false;
 }
 else
 {
 //连接成功
 check = true;
 m_bActive = true;
 m_connectype = TCPIP;
 }
delete []cip;


------解决方案--------------------
设置阻塞模式后,判断连接成功不是判断返回值的,在connect 之后加上如下代码判断连接是否成功!

//连接超时设置
struct timeval tmout ; 
fd_set r; 

FD_ZERO(&r); 
FD_SET(m_Socket, &r); 
tmout.tv_sec = 15; //连接超时时间
tmout.tv_usec =0; 
ret = select(sock, 0, &r, 0, &tmout); 
if ( ret <= 0 ) 

return FALSE;



------解决方案--------------------
 ret = ioctlsocket(sock, FIONBIO,(unsigned long *)&ul);//设置成非阻塞模式。
去掉这句不就是阻塞的?
------解决方案--------------------
将ul设置为0,也就是ul=0;就设回阻塞模式了。
------解决方案--------------------
geitlasterror查看一下错原因
------解决方案--------------------
引用:
设置阻塞模式后,判断连接成功不是判断返回值的,在connect 之后加上如下代码判断连接是否成功!

//连接超时设置
struct timeval tmout ; 
fd_set r; 

FD_ZERO(&r); 
FD_SET(m_Socket, &r); 
tmout.tv_sec = 15; //连接超时时间
tmout.tv_usec =0; 
ret = select(sock, 0, &r, 0, &tmout); 
if ( ret <= 0 ) 

return FALSE;



正解!非阻塞的套接字connect函数会立即返回失败的,需要用select检查是否连接成功。