2012-09-13 26 views
5
int func(boost::asio::ip::tcp::socket &socket) 
{ 
    boost::system::error_code ec; 
    socket.write_some(boost::asio::buffer("hello world!"), ec); 
    cout << socket.is_open() << endl; 
    if(ec) 
    { 
     cout << boost::system::system_error(ec).what() << endl; 
    } 
    return 0; 
} 

int main(int argc, char* argv[]) 
{ 
    using namespace boost::asio; 
    io_service iosev; 
    ip::tcp::acceptor acceptor(iosev, ip::tcp::endpoint(ip::tcp::v4(), 1000)); 

    while(1) 
    { 
     ip::tcp::socket socket(iosev); 
     acceptor.accept(socket); 
     boost::thread t = boost::thread(func, boost::ref(socket)); 
    } 
    return 0; 
} 

Tôi muốn một chủ đề mới xử lý kết nối mới. Nhưng trong chức năng "func", ổ cắm không mở và tôi nhận được "Bad descriptor". Tôi đọc một số ví dụ trong tài liệu và web, nhưng chúng không đồng bộ. Tôi nghĩ rằng nó không cần thiết cho nhu cầu đơn giản của tôi.Có "Bộ mô tả tập tin sai" khi sử dụng tăng :: asio và boost :: thread

Làm cách nào để khắc phục lỗi? Bất kỳ trợ giúp nào đều được đánh giá cao

+0

Có thể điều này xảy ra vì chuỗi chính thực hiện chấp nhận (socket) cùng một lúc, vì một luồng khác cố gắng làm việc với socket. Đi qua tham chiếu, bạn đang làm việc với cùng một cá thể socket. –

+0

@AlexFarber Tôi không nghĩ vậy. Bởi vì tôi chỉ sử dụng một máy khách để kết nối máy chủ, nên chỉ có một kết nối. – leezii

+0

Nhưng đồng thời, khi một khách hàng cố gắng làm việc với socket, chủ đề chính áp dụng toán tử chấp nhận cho cùng một socket. –

Trả lời

10

Ổ cắm của bạn là một vật thể tạm thời, bạn chuyển hiệu ứng cho nó nhưng đối tượng không nằm ngoài phạm vi và bị hủy trước khi xử lý. Sử dụng shared_ptr<socket> hoặc giữ chúng trong thùng chứa.

+0

Bạn nói đúng. Cảm ơn. – leezii