Có thể có trường hợp khi ổ cắm được báo cáo là đã sẵn sàng nhưng vào thời điểm bạn kiểm tra, nó sẽ thay đổi trạng thái của nó.
Một trong những ví dụ tốt là chấp nhận kết nối. Khi một kết nối mới đến, một ổ cắm nghe được báo cáo là đã sẵn sàng để đọc. Vào thời điểm bạn nhận được cuộc gọi chấp nhận, kết nối có thể bị đóng bởi phía bên kia trước khi gửi bất kỳ thứ gì và trước khi chúng tôi gọi là accept
. Tất nhiên, việc xử lý trường hợp này phụ thuộc vào hệ điều hành, nhưng có thể là accept
sẽ đơn giản chặn cho đến khi kết nối mới được thiết lập, điều này sẽ khiến ứng dụng của chúng tôi phải chờ một khoảng thời gian không hạn chế để xử lý các ổ cắm khác. Nếu ổ cắm nghe của bạn ở chế độ không chặn, điều này sẽ không xảy ra và bạn sẽ nhận được EWOULDBLOCK
hoặc một số lỗi khác, nhưng accept
sẽ không chặn bất kỳ cách nào.
Một số hạt nhân đã từng có (tôi hy vọng nó đã được khắc phục ngay) một lỗi thú vị với UDP và select
. Khi một datagram đến select
, hãy thức dậy với socket với datagram được đánh dấu là đã sẵn sàng để đọc. Việc xác nhận kiểm tra datagram được hoãn lại cho đến khi mã người dùng gọi recvfrom
(hoặc một số API khác có khả năng nhận các gói dữ liệu UDP). Khi mã gọi recvfrom
và mã xác nhận phát hiện một sự kiểm tra không khớp, một datagram chỉ đơn giản là bị bỏ và recvfrom
kết thúc bị chặn cho đến khi một datagram tiếp theo đến. Một trong các bản vá lỗi khắc phục sự cố này (cùng với mô tả sự cố) có thể được tìm thấy here.
Nguồn
2012-10-07 21:12:58
Aha, nhờ cho điều đó. :) – CaptainCodeman