connect超时时间过长connect连接时如果跨网段会造成超时,这样会阻塞当前,如果是带GUI的,则会卡住程序,这样
connect超时时间过长
connect连接时如果跨网段会造成超时,这样会阻塞当前,如果是带GUI的,则会卡住程序,
这样有2种解决方法:
1.用多线程,将连接放在线程中去处理,这样要等也没关系
2.但是实际上还可以设置非阻塞,然后select,这样也会卡,但是这个卡的时间可以自己去设定,那么卡2,3秒是可以满足目前的需求的
#define CONNECT_TIME_OUT 3
timeval tm; fd_set set; int error=-1, len; len = sizeof(int); unsigned long ul = 1; ioctl(m_sockfd, FIONBIO, &ul); //设置为非阻塞模式 bool ret = false; if (connect (m_sockfd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { tm.tv_sec = CONNECT_TIME_OUT; tm.tv_usec = 0; FD_ZERO(&set); FD_SET(m_sockfd, &set); if( select(m_sockfd+1, NULL, &set, NULL, &tm) > 0) { getsockopt(m_sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len); ret = error == 0 ? true : false; }else{ ret = false; } }else { ret = true; } ul = 0; ioctl(m_sockfd, FIONBIO, &ul); //设置为阻塞模式 if(not ret) { close(sockfd); return -1; }这里有一些别的解决方案和一些需要注意的
http://www.cnitblog.com/zouzheng/archive/2010/11/25/71711.html
