python - 检测套接字关闭的原因 : FIN vs RST

标签 python python-3.x sockets tcp python-asyncio

是否可以检测Python中套接字关闭的原因,即对方是否发送了FIN或RST?

我知道检测对方是否发送了 FIN 或 RST 的唯一方法是从套接字读取,如果你得到空(字节)字符串,那么我们就收到了 FIN 或 RST。但如何知道是哪一个呢?

import asyncio
import socket

async def async_main(loop):

    server_sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM,
                                proto=socket.IPPROTO_TCP)
    server_sock.setblocking(False)
    server_sock.bind(('', 8080))
    server_sock.listen(socket.IPPROTO_TCP)

    loop = asyncio.get_event_loop()
    sock, adddress = await loop.sock_accept(server_sock)

    while True:
        data = await loop.sock_recv(sock, 1024)
        if data == b'':
            # Socket closed, but how?
            break
        print(data)

loop = asyncio.get_event_loop()
loop.run_until_complete(async_main(loop))

最佳答案

基于 James K Polk 的 comment ,我相信这是正确的,您可以通过捕获适当的异常来区分 FINRST:

    while True:
        is_rst = False
        try:
            data = await loop.sock_recv(sock, 1024)
        except IOError as e:
            if e.errno == errno.ECONNRESET:
                data = b''
                is_rst = True
            else:
               raise
        if data == b'':
            # Connection closed - use is_rst to distinguish
            # between RST and FIN
            break
        print(data)

关于python - 检测套接字关闭的原因 : FIN vs RST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53345265/

相关文章:

python - 用于匹配 IPv4 地址的正则表达式

python - pandas dataframe groupby 索引并将行值转换为列

python - 无法运行 python 单元测试

javascript - 来自 ws 的 Node.js 和 Socket.io UTF8 验证类型错误

python - 在 Python 中对字符串进行切片

python - 选择与另一个列表相交的列表元素的简单方法? (Python)

python - 2 groupby 在同一个数据框中,可能吗?

python - 在数组的开头添加元素并在末尾删除 numpy

python - 是否有必要传达(或预期)Python Socket TCP Buff 大小

delphi - 从 DNS 获取 IP 地址而不使用 GetHostByName