python中关于socket的timeout设置的问题

今天发使用urllib2请求http时, 发现超时时间与设置的不一致。

例如下面的代码httpreq.request('http://www.baidu.com', timeout=1),将80端口使用iptables封掉后,发现要2秒才能超时,与设置的1不相符。抓包分析有两次连接,但不解为什么会连接两次,难道是重试机制?

跟踪了一下代码,发现最终会调用socket.create_connection来建立socket,

这块逻辑如下

def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT,
                      source_address=None):
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
        af, socktype, proto, canonname, sa = res 
        sock = None
        try:
            sock = socket(af, socktype, proto)
            if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
                sock.settimeout(timeout)
            if source_address:
                sock.bind(source_address)
            sock.connect(sa)
            return sock
可以发现在域名解析中,会对解析出的多个地址依次进行尝试连接,直到成功为止。而示例中的那个域名有两个ip,所以会尝试两次连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值