Определите, почему сокет закрыт: FIN против RST - PullRequest
0 голосов
/ 16 ноября 2018

Можно ли определить, почему сокет закрылся в Python, т.е. отправила ли другая сторона FIN или RST?

Единственный известный мне способ определить, имеет ли другая сторона senta 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))

1 Ответ

0 голосов
/ 17 ноября 2018

Исходя из комментария Джеймса Полка , который, как я считаю, является правильным, вы могли бы отличить FIN от RST, поймав соответствующее исключение:

    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)
...