2013-05-10 12 views
6

Từ hướng dẫn của epoll_ctl:Cho bất kỳ sự kiện ổ cắm TCP epoll nào, nếu EPOLLRDHUP = 0 và EPOLLIN = 1; là một cuộc gọi tiếp theo để đọc()/recv() đảm bảo trả về một kích thước đọc không bằng nhau đến 0?

EPOLLRDHUP (vì Linux 2.6.17)

Suối ổ cắm ngang hàng đóng kết nối, hoặc tắt bằng văn bản một nửa số kết nối. (Cờ này đặc biệt hữu ích cho việc viết mã đơn giản để phát hiện tắt máy ngang hàng khi sử dụng Cạnh giám sát kích hoạt.)

Từ hướng dẫn của recv:

Nếu không có thư có sẵn để được nhận và các đồng đẳng đã thực hiện một trật tự tắt máy, recv() sẽ trở lại 0.

dường như với tôi sau đó cả hai trang bìa trên các kịch bản giống nhau, và rằng miễn là tôi bắt sự kiện EPOLLRDHUP đầu tiên, tôi không bao giờ nhận được một read() hoặc recv() có độ dài 0 (và do đó không cần t o bận tâm kiểm tra như vậy). Nhưng điều này có được đảm bảo đúng không?

Trả lời

6

Nếu bạn nhận được sự kiện với EPOLLRDHUP=1 thì chỉ cần đóng kết nối ngay lập tức mà không cần đọc. Nếu bạn nhận được sự kiện với EPOLLRDHUP=0EPOLLIN=1 thì hãy tiếp tục và đọc, nhưng bạn nên chuẩn bị sẵn sàng để xử lý khả năng recv() vẫn trở về 0, chỉ trong trường hợp. Có lẽ một số FIN đến sau khi bạn nhận được EPOLLIN=1 nhưng trước khi bạn thực sự gọi recv().

+2

"Có lẽ FIN đến sau khi bạn nhận EPOLLIN = 1 nhưng trước khi bạn thực sự gọi recv()." Nhưng ngay cả khi FIN đến vào thời điểm đó, recv() sẽ trả về cái gì đó lớn hơn 0, phải không? Bởi vì ống FIFO vẫn chứa bất cứ điều gì gợi ý EPOLLIN = 1 ở nơi đầu tiên. – Will

+0

Câu trả lời hay. Tôi sẽ sửa đổi nó để nói, ".. đi trước và đọc, nhưng bạn nên chuẩn bị để xử lý khả năng recv() vẫn trở về 0 ** hoặc -1 **, chỉ trong trường hợp." – selbie

+0

@selbie Rõ ràng tôi nên làm và kiểm tra -1 (cả hai cho EAGAIN và các lỗi đột ngột khác). Ngoài ra, mặc dù các thủ tục được mô tả trong câu trả lời này có thể là tốt nhất và an toàn nhất (và tôi làm chính xác điều đó trong mã hiện tại của tôi), nó là * không * một câu trả lời tuyệt vời, bởi vì nó không đưa ra một câu trả lời thỏa mãn cho * tại sao * Tôi cần kiểm tra 0 (trong kịch bản được đề cập ở trên). – Will

Các vấn đề liên quan