Khi một đầu của liên kết TCP ngắt kết nối, nó sẽ gửi thông báo đặt lại (RST) đến đầu kia. Tôi muốn có thể nhận được điều này trong lớp ứng dụng.Phát hiện đặt lại TCP với ổ cắm Linux
Trong mã của mình, tôi sử dụng cuộc gọi select()
để nhận dữ liệu nhập từ nhiều nguồn tiềm năng, bao gồm kết nối TCP. Tôi đã thấy rằng khi select()
cho thấy rằng có sẵn dữ liệu để đọc trên kết nối và sau đó cuộc gọi read()
trả về 0 byte đã đọc, điều đó đã xảy ra sau khi RST được gửi qua TCP. (Tôi hiểu recv()
công trình tương tự như read()
.)
Liệu read()
return 0 byte (sau select()
) trên một kết nối TCP chỉ khi kết nối được thiết lập lại? Liệu nó có bao giờ trả lại 0 byte trong bất kỳ trường hợp nào khác không?
Tôi nhớ một thời gian trước đây sử dụng một thiết bị ethernet đặc biệt ở đầu bên kia của kết nối, và kết thúc Linux này đã nhận được 0 byte sau một select()
, nhưng không phải cho một thiết lập lại kết nối, mà đúng hơn là giữa đường thông qua một số dữ liệu phát trực tuyến. Tôi xác nhận trong Wireshark rằng gói nhận được có 0 byte dữ liệu. Đây có phải là một lỗi, hoặc giống như câu hỏi trên, liệu có hợp lệ để có hành vi này không? Tôi không thể nhớ đó là thiết bị nào, vì nó đã được một vài năm trở lại, nhưng nó đã được sử dụng một trình điều khiển Windows.
Lưu ý rằng người ta nên đọc câu hỏi mà tôi đã dự định bằng cách thay thế tinh thần "reset/RST" bằng "finish/FIN". Tôi vặn vẹo câu hỏi khi tôi viết nó. –
Sau đó, đơn giản, bạn đọc 0 byte từ ổ cắm nếu đồng đẳng đã đóng kết nối của nó bằng cách sử dụng đóng bình thường. Đây là đồng đẳng nói rằng tôi sẽ không còn gửi bất cứ điều gì cho bạn và nó được gọi là một nửa gần. –