gpt4 book ai didi

python - 如何在Python中检查套接字是否在这一端关闭

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:17 24 4
gpt4 key购买 nike

我有一个函数可以调用 socket.close() 来终止连接,我想检查它是否确实如此。 (我正在谈论我的脚本 - 如果它在另一端关闭则不是)由于某种原因,socket._closed 仍然返回 False,而 socket._connected 返回 True

尝试读/写它会抛出

*** ValueError: Read on closed or unwrapped SSL socket."

但我想在不尝试/异常(exception)的情况下进行验证(这非常困惑)。例如:

sock.close()
if sock.is_closed:
do_something()

有办法做到这一点吗?

最佳答案

来自When to not just use socket.close()

def recv_end(the_socket):
End='SERVER WRONG MARKER'
total_data=[];data='';got_end=False
while True:
data=the_socket.recv(8192)
if not data: break
if End in data:
total_data.append(data[:data.find(End)])
got_end=True
break
total_data.append(data)
if len(total_data)>1:
#check if end_of_data was split
last_pair=total_data[-2]+total_data[-1]
if End in last_pair:
total_data[-2]=last_pair[:last_pair.find(End)]
total_data.pop()
got_end=True
break
return (got_end,''.join(total_data))

def basic_server(sock):
got=[]
got_end,data = recv_end(sock)
if not got_end:
sock.send('ERROR:no end!') #<--- not possible w/close()
else: sock.sendall(data*2)
sock.shutdown(1)
sock.close()

import socket
Port=4444
def start_server():
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('',Port))
sock.listen(5)
print 'started on',Port
while True:
newsock,address=sock.accept()
basic_server(newsock)

def send_data(data):
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(('localhost',Port))
print 'connected'
sock.sendall(data+'CLIENT WRONG MARKER')
print 'sent',data
sock.shutdown(1)
print 'shutdown'
result=[]
while True:
got=sock.recv(2)
if not got: break
result.append(got)
sock.close()
return ''.join(result)

if __name__=='__main__':
start_server()

更简单、更小的解决方案

如果“此端”指的是服务器端,this answer应该有帮助。如果您指的是客户端,请使用 this answer 中的以下代码应该可以。

关于python - 如何在Python中检查套接字是否在这一端关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35319293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com