在linux下玩转带有超时时间的connect函数

在之前的文章中,我们在Windows下玩过带有超时时间的,本文我们在linux下来玩。在某次面试中,还被遇到了这个问题,有意思。

直接上客户端代码:

  #include <unistd.h>  #include <sys/types.h>  #include <sys/socket.h>  #include <netdb.h>  #include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <ctype.h>  #include <errno.h>  #include <malloc.h>  #include <netinet/in.h>  #include <arpa/inet.h>  #include <sys/ioctl.h>  #include <stdarg.h>  #include <fcntl.h>  #include <time.h>  int main(int argc, char *argv[]) // 注意输入参数, 带上ip和port  {    int sockClient = socket(AF_INET, SOCK_STREAM, 0);    struct sockaddr_in addrSrv;    addrSrv.sin_addr.s_addr = inet_addr(argv[1]);    addrSrv.sin_family = AF_INET;    addrSrv.sin_port = htons(atoi(argv[2]));   fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0)|O_NONBLOCK);     int iRet = connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));   printf("connect iRet is %d, errmsg:%sn", iRet, strerror(errno)); // 返回-1不一定是异常   if (iRet != 0)    {      if(errno != EINPROGRESS)   {    printf("connect error:%sn", strerror(errno));    }     else    {    struct timeval tm = {5, 0};     fd_set wset, rset;     FD_ZERO(&wset);     FD_ZERO(&rset);     FD_SET(sockClient, &wset);     FD_SET(sockClient, &rset);     int time1 = time(NULL);    int n = select(sockClient + 1, &rset, &wset, NULL, &tm);     int time2 = time(NULL);    printf("time gap is %dn", time2 - time1);    if(n < 0)     {      printf("select error, n is %dn", n);     }     else if(n == 0)     {      printf("connect time outn");     }     else if (n == 1)     {     if(FD_ISSET(sockClient, &wset))      {       printf("connect ok!n");       fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0) & ~O_NONBLOCK);      }      else      {       printf("unknow error:%sn", strerror(errno));      }     }    else    {    printf("oh, not care now, n is %dn", n);    }   }    }    printf("I am here!n");    getchar();    close(sockClient);    return 0;  }

服务端代码,我们已经写过多次,本文就不写了。

经测试,上述程序OK, 用tcpdump抓包,还能学到不少东西,比如SYN包重传,RST包等。有点意思。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

参与评论