accept与connect的超时设置

connect超时:

我们都知道,connect对应与三次握手中的第一次发送SYN,而对待服务器的ACK,如果服务器没有启动服务器,有些机器会立刻返回一个RST表示服务器拒绝,从而connect失败,但又些服务器为了防止攻击,什么也不发送,直至客户端connect超时,而这一时间又75s,对于客户端来说是不能接收的。所以需要设置connect的超时时间。

利用select设置connect的超时时间:

[cpp]  view plain  copy
  1. <span style="white-space:pre">    </span>uint32_t ul = 1;  
  2.     ioctl(sock, FIONBIO, &ul);//设置成非阻塞  
  3.     printf("start time: %u\n", time(0));  
  4.     bool success = false;  
  5.     if (connect(sock, (sockaddr *)&srv_addr, sizeof srv_addr ) == -1)  
  6.     {  
  7. <span style="white-space:pre">        </span>struct timeval tm;  
  8.         tm.tv_sec = 3;  
  9.         tm.tv_usec = 0;  
  10. <span style="white-space:pre">        </span>fd_set set;  
  11.         FD_ZERO(&set);  
  12.         FD_SET(sock, &set);  
  13.         if (select(sock + 1, NULL, &set, NULL, &tm) > 0)  
  14.         {  
  15.             int error = 0;  
  16.             int len = sizeof(int);  
  17.             getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);  
  18.             if (0 == error) success = true;  
  19.         }  
  20.         else  
  21.         {  
  22.             success = false;  
  23.         }  
  24.     }  
  25.     ul = 0;  
  26.     ioctl(sock, FIONBIO, &ul); //设置成阻塞  

accept超时:

一半来说服务器应该都是在accept状态,也就无需设置accept超时时间,但一些特殊情况还是需要的。对于accept我们可以使用select多路复用来实现超时设置,但那个代码较多。那有没有别的办法呢?我们指定,accept对应三次握手中中服务器接收SYN,那么我们能不能通过设置recv超时来实现accept超时呢?答案是肯定的。

[cpp]  view plain  copy
  1. struct timeval timeout = {6,0};  
  2. if (setsockopt(proxy_sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval)) != 0)  
  3. {  
  4.     printf("set accept timeout failed");  
  5. }  
  6. sock = ::accept(proxy_sock, (sockaddr *)NULL, NULL);  

既然可以用recv超时来设置accept超时,那对于connect能不能通过设置send超时来实现connect超时呢?答案是肯定的!!!

[cpp]  view plain  copy
  1. setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(struct timeval));  
只要将connect和accept对应到三次握手过程中就不难理解这些了。

综上:

我们可以通过设置SO_RECVTIMEO和SO_SENDTIMEO来设置accept超时和connect超时。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值