2013-05-15 31 views
5

Tôi đang sử dụng boost::asio cho ứng dụng máy chủ/ứng dụng khách. Máy chủ chỉ chấp nhận một kết nối tại một thời điểm. Tôi tự hỏi đâu là cách tốt nhất để máy chủ xác minh xem máy khách có được kết nối hay không.Tăng ASIO: Làm thế nào một máy chủ có thể biết được liệu một khách hàng có còn được kết nối không?

Mục đích của việc này là tôi muốn biết liệu khách hàng có gặp sự cố hay không, để tôi có thể khởi động lại việc nghe những nỗ lực kết nối mới.

+0

Bạn cần nhịp tim cấp ứng dụng - không có cách nào đáng tin cậy khác. –

Trả lời

3

Trong ứng dụng của tôi, tôi đang sử dụng các cờ sau và đọc của tôi xuất hiện khi khách hàng ngắt kết nối. Hãy thử nó nếu nó trong ứng dụng của bạn. Áp dụng cờ này ngay sau khi kết nối.

trong trường hợp của tôi skt_TCP là loại boost::asio::ip::tcp::socket

int32_t accept_server_socket = skt_TCP.native_handle(); 

int32_t timeout = 8; 
int32_t cnt = 2; 
int32_t intverval = 2; 

// Added Keepalive flag 
boost::asio::socket_base::keep_alive opt_keep_alive(true); 
skt_TCP.set_option(opt_keep_alive); 
setsockopt(accept_server_socket, SOL_TCP, TCP_KEEPIDLE, &timeout, sizeof(timeout)); 
setsockopt(accept_server_socket, SOL_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt)); 
setsockopt(accept_server_socket, SOL_TCP, TCP_KEEPINTVL, &intverval, sizeof(intverval)); 
0

Điều này thực sự phụ thuộc vào sự lựa chọn của bạn của giao thức.

Simple lệnh Nghị định thư

Nếu giao thức máy chủ của bạn luôn luôn chờ đợi một tin nhắn từ khách hàng, bạn sẽ luôn có một cấp phát async_read cho mỗi khách hàng được kết nối. Điều này sẽ trở lại với một lỗi (EOF) khi một khách hàng ngắt kết nối trong bất kỳ thời trang nào.

Keep-alive là một cách tiếp cận như đã nói ở trên, nhưng việc chờ xử lý của async_read chỉ tốt cho mục đích này.

Giao thức sự kiện đơn giản

Giao thức sự kiện đơn giản liên quan đến khách hàng đang nghe dữ liệu và máy chủ gửi dữ liệu đó. Trong giao thức này, máy chủ không biết liệu máy khách có ở đó không, bởi vì máy khách chỉ chấp nhận dữ liệu và tiếp tục chờ đợi. Máy khách không bao giờ gửi máy chủ bất kỳ thông báo nào.

Điều này thể hiện yêu cầu để duy trì hoạt động. Các hoạt động async_write không hoạt động theo cùng cách mà async_read thực hiện khi một máy khách đã bị ngắt kết nối.

Có các tùy chọn khác, như việc máy chủ luôn có hoạt động async_read đang chờ xử lý cố đọc 1 byte. Điều này sẽ thất bại khi máy khách ngắt kết nối tương tự như thảo luận về Giao thức Lệnh Đơn giản ở trên, nhưng sẽ không bao giờ thành công vì khách hàng không gửi dữ liệu qua Giao thức Sự kiện Đơn giản.