超时connect

来源:互联网 发布:新西兰45秒彩开奖数据 编辑:程序博客网 时间:2024/04/29 23:59

sock选项SO_SNDTIMEO和SO_RCVTIMEO可以用来发送和接收超时时间,对于设置了以上选项的socket描述符,connect具有超时连接功能即在指定的时间内为连接会返回-1并置errno为EINPROGRESS

具有超时connect功能的客户端代码:

#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdlib.h>#include<assert.h>#include<errno.h>#include<stdio.h>#include<fcntl.h>#include<unistd.h>#include<string.h>#include<iostream>using namespace std;int timeout_connect(const char* ip,int port,int time){//超时connect    int ret=0;    struct sockaddr_in address;    bzero(&address,sizeof(address));    address.sin_family=AF_INET;    inet_pton(AF_INET,ip,&address.sin_addr);    address.sin_port=htons(port);    int sockfd=socket(PF_INET,SOCK_STREAM,0);    assert(sockfd>=0);    struct timeval timeout;//时间结构体    timeout.tv_sec=time;    timeout.tv_usec=0;    socklen_t len=sizeof(timeout);    ret=setsockopt(sockfd,SOL_SOCKET,SO_SNDTIMEO,&timeout,len);//设置sockfd超时属性SO_SNDTIMEO    assert(ret!=-1);    ret=connect(sockfd,(struct sockaddr*)&address,sizeof(address));    if(ret==-1){        if(errno==EINPROGRESS){//EINPROGRESS错误才是超时            cout<<"connect timeout"<<endl;//这里定义超时逻辑            return -1;        }        cout<<"something wrong in connect"<<endl;        return -1;    }    return sockfd;}int main(int argc,char* argv[]){    if(argc<=2){        cout<<"argc<=2"<<endl;        return 1;    }    const char* ip=argv[1];    int port=atoi(argv[2]);    int sockfd=timeout_connect(ip,port,5);//5s超时时间    if(sockfd<0){        return 1;    }    return 0;}