Khi tôi đóng socket trên một đầu của một kết nối, đầu kia được một lỗi lần thứ hai nó sẽ gửi dữ liệu, nhưng không phải là lần đầu tiên:Python không phát hiện một ổ cắm đóng cửa cho đến thứ hai gửi
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
Tôi đã thử đặt TCP_NODELAY, bằng cách sử dụng send
thay vì sendall
, kiểm tra fileno()
, tôi không thể tìm thấy bất kỳ cách nào để gửi thông báo lỗi đầu tiên hoặc thậm chí phát hiện lỗi không thành công. EDIT: gọi sock.shutdown
trước sock.close
không có tác dụng. EDIT # 2: thậm chí thêm time.sleep
sau khi đóng và trước khi viết không quan trọng. EDIT # 3: kiểm tra số byte được trả về bởi send
không giúp đỡ, vì nó luôn trả về số byte trong thư.
Vì vậy, giải pháp duy nhất tôi có thể đưa ra nếu tôi muốn phát hiện lỗi là làm theo mỗi sendall
với số client.sendall("")
sẽ gây ra lỗi. Nhưng điều này có vẻ bị hack. Tôi đang trên một Linux 2.6.x vì vậy ngay cả khi một giải pháp chỉ làm việc cho hệ điều hành đó tôi sẽ được hạnh phúc.
Tôi gặp vấn đề tương tự. Làm cách nào để bạn giải quyết vấn đề trong mã của mình? – HighCommander4
@HighCommander: Tôi đã kết thúc việc thêm một khách hàng.sendall ("") 'sau mỗi' send', không được đảm bảo về mặt kỹ thuật để lỗi, nhưng hoạt động cho chương trình của tôi cho thời gian và chi tiết cụ thể về những gì tôi đang làm. Điều này là không phù hợp và tôi thực sự mong rằng có một cách để truy cập trạng thái socket TCP cơ bản, nhưng có vẻ như không, hoặc trong Python hoặc C. –
có hiệu quả với bạn khi máy khách và máy chủ trên các máy khác nhau không? Nó không cho tôi, sendall() thành công trong trường hợp đó. – HighCommander4