2009-05-04 41 views
5

Cách dễ nhất để kiểm tra xem một ổ cắm đã được đóng ở phía xa của kết nối? socket::is_open() trả về true ngay cả khi nó được đóng ở phía xa (tôi đang sử dụng boost::asio::ip::tcp::socket).Làm cách nào để kiểm tra xem ổ cắm có được đóng trong Boost.Asio không?

Tôi có thể thử đọc từ luồng và xem liệu nó có thành công hay không, nhưng tôi phải thay đổi logic của chương trình để làm cho nó hoạt động theo cách này (tôi không muốn dữ liệu được trích xuất từ ​​luồng điểm kiểm tra).

+0

Tại sao bạn cần biết liệu kết nối từ xa đã đóng chưa? – outis

+0

Ngoài ra, bạn có đang sử dụng giao thức ứng dụng của thiết kế của riêng bạn hoặc giao thức chuẩn không? – outis

+0

Tôi đang viết một chương trình trò chuyện cơ bản và tôi cần thông báo cho người dùng rằng người kia đã đóng ứng dụng. Tôi có giao thức của riêng mình và tôi đã thêm thông báo "Thoát". Hạn chế duy nhất là nó không được gửi nếu ứng dụng bị giết/treo/etc. – Hali

Trả lời

4

Nếu kết nối đã được đóng kín bởi đồng nghiệp, bạn sẽ nhận được EOF khi đang đọc. Nếu không, tôi thường ping để tìm hiểu xem kết nối có thực sự sống hay không.

+1

... và tôi cần đọc để lấy EOF. Tôi đoán không có cách nào xung quanh. Cảm ơn! – Hali

7

Có chức năng tăng cường xem nhanh không? Hầu hết các triển khai socket đều có cách đọc dữ liệu mà không xóa dữ liệu khỏi hàng đợi, vì vậy bạn có thể đọc lại sau. Điều này dường như đáp ứng yêu cầu của bạn.

Sau khi nhanh chóng liếc qua tài liệu asio, tôi không thể tìm thấy chính xác những gì tôi mong đợi, nhưng điều đó không có nghĩa là nó không có ở đó.

Tôi muốn đề xuất this cho người mới bắt đầu.

+0

Vâng, bạn nói đúng. Bạn có thể chuyển cờ cho phương thức "nhận" cho biết nó không xóa dữ liệu. Tôi đã sử dụng phương pháp "read_some", không có đối số cờ này. Cảm ơn đã chỉ ra điều đó! – Hali

+0

giả sử bạn đã thiết lập socket và phản hồi sau đó bạn có thể thiết lập luồng, ví dụ: std :: istream myhttpstream (& presponse); và sau đó bạn có thể sử dụng hàm std :: istream :: peek(). –

+0

Tôi làm điều này: receive = socket() nhận (tăng :: asio :: buffer (buf), tcp :: socket :: message_peek); –

1

Tôi nghĩ rằng nói chung khi bạn mở một ổ cắm, bạn nên bắt đầu đọc nó ngay lập tức và không bao giờ ngừng làm như vậy. Bằng cách này, bạn có thể làm cho máy chủ hoặc máy khách của mình hỗ trợ cả hai giao thức đồng bộ và không đồng bộ. Thời điểm khách hàng đóng kết nối, thời điểm đọc sẽ cho bạn biết điều này.

0

Sử dụng error_code có thể kiểm tra điều kiện liệu khách hàng có được kết nối hay không. Nếu kết nối thành công, error_code error.value() sẽ trả về 0, trả về giá trị khác. Bạn cũng có thể kiểm tra thông báo() từ error_code.

7

Chỉ cần kiểm tra lỗi boost::asio::error::eof trong trình xử lý async_receive của bạn. Nó có nghĩa là kết nối đã bị đóng. Đó là cách duy nhất để làm điều này.

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