- 论坛徽章:
- 0
|
/*入口参数:ServerAddr要连接的地址,int nsec超时限制秒数
出口参数: -1 连接失败,一般指对端不可达,或者无服务,不关闭SockFd
-2 连接失败 ,超时退出,关闭SockFd。防止三次握手继续
*/
int Connect(const int SockFd,struct sockaddr_in ServerAddr,int nsec)
{
int flags,n,error;
fd_set rset,wset;
socklen_t len;
struct timeval tval;
flags=fcntl(SockFd,F_GETFL,0);
fcntl(SockFd,F_SETFL,flags|O_NONBLOCK);
error=0;
if((n=connect(SockFd,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr)))<0)
{
if(errno!=EINPROGRESS)
{
return -1;
}
}
if(n==0)
goto done;
FD_ZERO(&rset);
FD_SET(SockFd,&rset);
wset=rset;
tval.tv_sec=nsec;
tval.tv_usec=0;
if((n=select(SockFd+1,&rset,&wset,NULL,nsec?&tval:NULL))==0)
{
::close(SockFd);
return -2;
}
if(FD_ISSET(SockFd,&rset) || FD_ISSET(SockFd,&wset))
{
len=sizeof(error);
if(getsockopt(SockFd,SOL_SOCKET,SO_ERROR,&error,&len)<0)
{
return -1;
}
}
done:
fcntl(SockFd,F_SETFL,flags);
if(error)
{
::close(SockFd);
return -2;
}
return 0;
} |
|