TCP có nghĩa là để được mạnh mẽ khi đối mặt với một mạng lưới khắc nghiệt; mặc dù TCP cung cấp những gì trông giống như một kết nối end-to-end liên tục, tất cả chỉ là một lời nói dối, mỗi gói thực sự chỉ là một datagram duy nhất, không đáng tin cậy.
Các kết nối thực sự chỉ là ống dẫn ảo được tạo với trạng thái nhỏ được theo dõi ở mỗi đầu của kết nối (cổng nguồn và đích và địa chỉ và ổ cắm cục bộ). Ngăn xếp mạng sử dụng trạng thái này để biết quy trình nào cung cấp cho mỗi gói đến và trạng thái nào được đặt trong tiêu đề của mỗi gói gửi đi.
Do tiềm ẩn — vốn phi kết nối và không đáng tin cậy — bản chất của mạng, ngăn xếp sẽ chỉ báo cáo một kết nối bị cắt đứt khi kết thúc từ xa gửi một gói tin FIN để đóng kết nối, hoặc nếu nó doesn' t nhận được một phản ứng ACK cho một gói tin gửi đi (sau một thời gian chờ và một vài lần thử lại).
Do tính chất không đồng bộ của asio, cách dễ nhất để được thông báo về ngắt kết nối duyên dáng là có số async_read
nổi bật sẽ trả lại error::eof
ngay lập tức khi kết nối bị đóng. Nhưng điều này một mình vẫn còn khả năng của các vấn đề khác như kết nối một nửa mở và các vấn đề mạng sẽ không bị phát hiện.
Cách hiệu quả nhất để làm việc xung quanh gián đoạn kết nối không mong muốn là sử dụng một số loại giữ nguyên hoặc ping. Điều này thường xuyên cố gắng để chuyển dữ liệu qua kết nối sẽ cho phép phát hiện đúng đắn của một kết nối vô tình bị cắt đứt.
Giao thức TCP thực sự có tích hợp keep-alive mechanism có thể được định cấu hình bằng asio sử dụng asio::tcp::socket::keep_alive
. Điều tuyệt vời về TCP keep-alive là nó trong suốt đối với ứng dụng chế độ người dùng, và chỉ những đồng nghiệp quan tâm đến việc giữ cho nó luôn cần cấu hình nó. Nhược điểm là bạn cần truy cập/kiến thức ở mức hệ điều hành để cấu hình các tham số thời gian chờ, chúng không được tiếp xúc thông qua tùy chọn socket đơn giản và thường có giá trị timeout mặc định khá lớn (7200 giây trên Linux).
Có lẽ phương pháp phổ biến nhất để giữ sống là triển khai nó ở lớp ứng dụng, trong đó ứng dụng có thông báo ping hoặc ping đặc biệt và không làm gì ngoài phản hồi khi bị cù. Phương pháp này mang đến cho bạn sự linh hoạt nhất trong việc thực hiện chiến lược tiếp tục sống.
bản sao có thể có của [Cách kiểm tra xem ổ cắm có được đóng trong Boost.Asio không?] (Http://stackoverflow.com/questions/818665/how-to-check-if-socket-is-closed-in-boost -asio) – joshperry