Когда я закрываю сокет на одном конце соединения, другой конец получает ошибку во второй раз, когда он отправляет данные, но не в первый раз:
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()
, я не могу найти способ получить первую отправку, чтобы выбросить ошибку или даже обнаружить впоследствии, что она не удалась, EDIT: вызов sock.shutdown
до sock.close
не помогает. РЕДАКТИРОВАТЬ № 2:, даже добавив time.sleep
после закрытия и до написания не имеет значения. РЕДАКТИРОВАТЬ № 3: проверка количества байтов, возвращаемого send
, не помогает, так как он всегда возвращает количество байтов в сообщении.
Поэтому единственное решение, которое я могу решить, если я хочу обнаружить ошибки, - это следовать за каждым sendall
с помощью client.sendall("")
, который вызовет ошибку. Но это кажется хакерским. Я на Linux 2.6.x, поэтому, даже если решение работает только для этой ОС, я был бы счастлив.