是否可以检测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 ,我相信这是正确的,您可以通过捕获适当的异常来区分 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)
关于python - 检测套接字关闭的原因 : FIN vs RST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53345265/