当前位置: 技术问答>linux和unix
socket 连接超时的问题
来源: 互联网 发布时间:2016-05-16
本文导语: //------------------------------------------------------------------- //--非阻塞状态的connect函数 int CSocketDevice::Connect_nonblock(unsigned long Ip, unsigned short Port) { enum BLOCK_FLAG { NON_BLOCK=1, BLOCK=0, }; int iRet; int error=...
//-------------------------------------------------------------------
//--非阻塞状态的connect函数
int CSocketDevice::Connect_nonblock(unsigned long Ip, unsigned short Port)
{
enum BLOCK_FLAG
{
NON_BLOCK=1,
BLOCK=0,
};
int iRet;
int error=-1;
int len=sizeof(int);
sockaddr_in srv_sockaddr;
srv_sockaddr.sin_family=AF_INET;
srv_sockaddr.sin_addr.s_addr=Ip;
srv_sockaddr.sin_port=htons(Port);
unsigned long ulblock_flag=NON_BLOCK;
ioctl(this->Sock, FIONBIO, &ulblock_flag);
bool bRet=false;
iRet=connect(this->Sock, (struct sockaddr*)&srv_sockaddr, sizeof(srv_sockaddr));
if(iRet==-1)
{
if(errno == EINPROGRESS)
{
timeval timeout;
timeout.tv_sec = TIMEOUT_SEC;
timeout.tv_usec = TIMEOUT_USEC;
fd_set write_set;
FD_ZERO(&write_set);
FD_SET(this->Sock,&write_set);
iRet=select(this->Sock+1,NULL,&write_set,NULL,&timeout);
if(iRet>0) //good connect
{
bRet=true;
}
else if(iRet == 0) //my time out, but no socket error
{
printf("==Connect() time out!n");
bRet=false;
}
else //socket error
{
getsockopt(this->Sock,SOL_SOCKET,SO_ERROR,&error,(socklen_t*)&len);
if(error==0)
{
bRet=true;
}
else
{
bRet=false;
} }
}
else
{
bRet=false;
}
}
else
{
bRet=true;
}
//ulblock_flag=BLOCK;
//ioctl(this->Sock, FIONBIO, &ulblock_flag);
//-----------------------------------------------------------
if(bRet==true)
{
return 0;
}
return -1;
}
请教一下为什么在select()返回-1的时候要调用getsockopt()函数,并且为什么getsockopt()的error返回0的时候认为是连接成功呢?
|
非阻塞情况下当套接字连接成功时 select返回描述字是可写的,连接错误了则返回的是可读写的,至于什么错误只好getsockopt
|
select 返回-1的时候, 不一定是因为套接口出错了, 有可能是因为信号中断了系统调用, 所以使用getsockopt来判断套接口是否有错误发生
|
请教一下为什么在select()返回-1的时候要调用getsockopt()函数,并且为什么getsockopt()的error返回0的时候认为是连接成功呢?
select失败与该socket的描述字连接返回的状态无关啊.select返回-1失败后,调用getsockopt()函数只是测试一下select的错误是否是socket本身引起的.若无关则认为返回成功应该是合理的啊.
select失败与该socket的描述字连接返回的状态无关啊.select返回-1失败后,调用getsockopt()函数只是测试一下select的错误是否是socket本身引起的.若无关则认为返回成功应该是合理的啊.