python non blocking socket 如何设置 timeout
阿神
阿神 2017-04-18 10:03:00
[Python讨论组]

在学习使用协程的时候, 想写一个TCP扫描器, 但碰到了一个问题, 我希望socket的connect和recv方法最多只等待1s, 想设置settimeout的, 但是好像和setblocking(False)冲突, 这样会在等待连接的时候花很长的时间, 不知道怎么解决。

import asyncio
import socket


loop = asyncio.get_event_loop()
CHUNK_SIZE = 1024


async def connect(host, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setblocking(False)
    print("%s:%d" % (host, port))
    try:
        await loop.sock_connect(sock, (host, port))
    except (socket.timeout, ConnectionRefusedError):
        pass
    else:
        await loop.sock_sendall(sock, "test\r\n".encode("utf-8"))
        response = b""
        try:
            chunk = await loop.sock_recv(sock, CHUNK_SIZE)
        except (socket.timeout, ConnectionResetError):
            pass
        else:
            while chunk:
                print(chunk)
                response += chunk
                chunk = await loop.sock_recv(sock, CHUNK_SIZE)
    finally:
        sock.close()


def main():
    host_name_list = ["www.baidu.com", "cn.bing.com", "www.acfun.tv", "www.bilibili.com", "www.zhihu.com"]
    host_list = [socket.gethostbyname(name) for name in host_name_list]
    port_list = [23, 45, 123, 22, 55, 666, 77, 88, 99, 1010,1 ,2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
    tasks = asyncio.gather(*[connect(host, port) for host in host_list for port in port_list])
    loop.run_until_complete(tasks)
    loop.close()


if __name__ == "__main__":
    main()
阿神
阿神

闭关修行中......

全部回复(2)
伊谢尔伦
def setblocking(self, flag): # real signature unknown; restored from __doc__
    """
    setblocking(flag)
    
    Set the socket to blocking (flag is true) or non-blocking (false).
    setblocking(True) is equivalent to settimeout(None);
    setblocking(False) is equivalent to settimeout(0.0).
    """
    pass
PHPz
await loop.sock_connect(sock, (host, port))

改成

await asyncio.wait_for(loop.sock_connect(sock, (host, port)), timeout=1)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号