socket设置超时的几种方法

2/22/2017来源:ASP.NET技巧人气:1884

1.建立socket 2.将该socket设置为非阻塞模式 3.调用connect() 4.使用select()检查该socket描述符是否可写(注意,是可写) 5.根据select()返回的结果判断connect()结果 6.将socket设置为阻塞模式(如果你的程序不需要用阻塞模式的,这步就省了,一般情况下都是用阻塞模式的)

#include  #include  #define TIME_OUT_TIME 20 //connect超时时间20秒 int main(int argc , char **argv) { ……………… int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0) exit(1); struct sockaddr_in serv_addr; ………//以服务器地址填充结构serv_addr int error=-1, len; len = sizeof(int); timeval tm; fd_set set; unsigned long ul = 1; ioctl(sockfd, FIONBIO, &ul); //设置为非阻塞模式 bool ret = false; if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) ==   -1) { tm.tv_set = TIME_OUT_TIME; tm.tv_uset = 0; FD_ZERO(&set); FD_SET(sockfd, &set); if( select(sockfd+1, NULL, &set, NULL, &tm) > 0) { getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len); if(error == 0) ret = true; else ret = false; } else ret = false; } else ret = true; ul = 0; ioctl(sockfd, FIONBIO, &ul); //设置为阻塞模式 if(!ret) { close( sockfd ); fPRintf(stderr , "Cannot Connect the server!n"); return; } fprintf( stderr , "Connected!n"); //下面还可以进行发包收包操作

}