当前位置:编程学习 > 网站相关 >>

设置connect超时时间

socket编程中,当客户端connect()连接一个服务端时,如果网络或服务端繁忙,connect()函数会迟迟不会返回(阻塞模式下)。这里有个方法,可以设置如果在给定的时间内还没有连接上,就不在连接。

1、设置socket为非阻塞模式

2、connect()连接

3、如果出错,用select()系统调用对其进行超时检测,看在给定的时间内socket是否变得可写

int fd = socket(PF_INET,SOCK_STREAM,0); 
... 
int flags = fcntl(fd,F_GETFL,0); 
fcntl(fd,F_SETFL,flags | O_NONBLOCK); 
int n = connect(fd,(struct sockaddr*)&addr,sizeof addr); 
if(n < 0) 
{  // EINPROGRESS表示connect正在尝试连接 
    if(errno != EINPROGRESS && errno != EWOULDBLOCK) 
        return 1; 
 
    struct timeval tv; 
    tv.tv_sec = 10; 
    tv.tv_usec = 0; 
    fd_set wset; 
    FD_ZERO(&wset); 
    FD_SET(fd,&wset); 
    n = select(fd+1,NULL,&wset,NULL,&tv); 
    if(n < 0) 
    { // select出错 
        perror("select()"); 
        close(fd); 
        return 1; 
    } 
    else if (0 == n) 
    { // 超时 
        cerr<< "Timeout." << endl; 
        close(fd); 
        return 1; 
    } 
    else 
    {  // 连接成功 
        cerr << "Connectd." <<endl; 
    } 

 
fcntl(fd,F_SETFL,flags & ~O_NONBLOCK);  // 设为阻塞模式 

补充:综合编程 , 其他综合 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,