Когда я закрываю сокет на одном конце соединения, другой конец получает ошибку во второй раз, когда отправляет данные, но не в первый раз:
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("localhost", 12345))
server.listen(1)
client = socket.create_connection(("localhost",12345))
sock, addr = server.accept()
sock.close()
client.sendall("Hello World!") # no error
client.sendall("Goodbye World!") # error happens here
Я пытался установить TCP_NODELAY, используя send
вместо sendall
, проверяя fileno()
, я не могу найти способ получить первое посылку, чтобы выдать ошибку или даже обнаружить впоследствии, что она не удалась , РЕДАКТИРОВАТЬ: вызов sock.shutdown
до sock.close
не помогает. РЕДАКТИРОВАНИЕ # 2: даже добавление time.sleep
после закрытия и перед записью не имеет значения. РЕДАКТИРОВАТЬ # 3: проверка количества байтов, возвращаемых send
, не помогает, поскольку всегда возвращает количество байтов в сообщении.
Таким образом, единственное решение, которое я могу придумать, если я хочу обнаружить ошибки, - это следовать каждому sendall
с client.sendall("")
, что вызовет ошибку. Но это кажется хакерским. Я использую Linux 2.6.x, поэтому, даже если бы решение работало только для этой ОС, я был бы счастлив.