2011-01-15 35 views
5

Tôi đang phát triển một vòng lặp máy chủ nhỏ cho một phần mềm lớn hơn nhưng nó không hoạt động như tôi muốn nó làm.Dừng vòng lặp máy chủ luồng bằng cách sử dụng Boost :: Asio

Khi người dùng nhập vào ".quit" Tôi muốn các phần mềm để ngăn chặn vòng lặp này máy chủ ren:

try { 

while (true) { 
     acceptor.accept(socket); 
     const size_t buffersize = 1024; 
     char data[buffersize+1] = {0}; 
     data[socket.read_some(boost::asio::buffer(data,buffersize))] = '\0'; // Write data & place terminator 
     boost::thread asyncWriting(boost::bind(&myClass::writeToFile, this)); 
     socket.close(); 
} 

} catch(const boost::system::system_error& e) { 
    cout << "Boost System Error: " << e.what() << endl; 
} 

tôi bắt đầu chủ đề theo cách sau:

serverThread = boost::shared_ptr<boost::thread>(new boost::thread(boost::bind(&myClass::startServer, this))); 

Nhưng tôi có vấn đề dừng "máy chủ". Không có vấn đề nếu tôi làm gián đoạn luồng, đóng socket và/hoặc chấp nhận hoặc chỉ phá vỡ các chương trình Boost ném lỗi:

Bad file descriptor 

Nó không xảy ra mỗi khi nhưng thường và tôi muốn khắc phục vấn đề đó và không chỉ phớt lờ nó.

Bạn có thể giúp tôi cách tắt tính năng này sạch không?

+0

nó sẽ rất hữu ích nếu bạn có thể đính kèm một debugger và cho chúng tôi biết những ngoại lệ được ném. Có nhiều phương thức asio có thể ném một 'boost :: system :: system_error' bằng một mã lỗi của' boost :: system :: errc :: bad_file_descriptor'. –

Trả lời

2

Thông thường các máy chủ được viết bằng các phương pháp không đồng bộ

  • async_accept
  • async_read
  • async_write

trong trường hợp này các kỹ thuật đề nghị tắt tất cả các hoạt động không đồng bộ cấp phát là stop các io_service ' s xử lý sự kiện vòng lặp. Lưu ý rằng bạn nên đặc biệt chú ý đến ~io_servicedocumentation

The destruction sequence described above permits programs to simplify their resource management by using shared_ptr<>. Where an object's lifetime is tied to the lifetime of a connection (or some other sequence of asynchronous operations), a shared_ptr to the object would be bound into the handlers for all asynchronous operations associated with it.

Nó không rõ ràng với tôi dựa trên mã hạn chế mà bạn đã đăng mà vấn đề của bạn là, tôi muốn đề nghị gửi mã nhiều hơn hoặc chạy những gì bạn có dưới valgrind vì có nhiều khả năng sẽ hiển thị một số sự cố.

tôi đã trả lời một similar question cách đây vài ngày mà bạn có thể thấy hữu ích

+0

Hi Sam, cảm ơn câu trả lời của bạn! Tôi cũng tìm thấy câu hỏi trong tìm kiếm Google của tôi hôm nay nhưng không thực sự chắc chắn liệu tôi có nên sử dụng phương pháp này hay không. Nhưng tôi sẽ xem xét, làm cho nó không đồng bộ và viết kinh nghiệm của tôi ở đây. – Paul

+0

Làm việc hoàn hảo. Cần phải biết rằng bạn có thể ràng buộc người chấp nhận và kết thúc nó một cách an toàn với sự trợ giúp của io_service.stop(); – Paul

+0

@Paul tuyệt vời! Vui vì tôi có thể giúp bạn. –

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