2012-09-13 6 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; 
} 

新しいスレッドが新しい接続を処理したい。しかし関数 "func"では、ソケットはオープンではなく、 "Bad file descriptor"を取得しています。私はドキュメントとWebでいくつかの例を読んでいますが、それらは非同期です。私はそれが私の単純な要求のために必要ではないと思う。boost :: asioとboost :: threadを使用すると「不正なファイル記述子」が表示される

エラーを修正するにはどうすればよいですか?どんな助けもあります

+0

おそらく、メインスレッドがaccept(socket)を同時に実行し、別のスレッドがソケットを処理しようとしているためです。参照渡しでは、同じソケットインスタンスで作業しています。 –

+0

@AlexFarber私はそれを考えていません。私はサーバーを接続するために1つのクライアントしか使用しないので、1つの接続しかありません。 – leezii

+0

しかし同時に、あるクライアントがソケットで作業しようとすると、メインスレッドはaccept演算子を同じソケットに適用します。 –

答えて

10

あなたのソケットは一時的なオブジェクトですが、あなたはそれに合格しますが、オブジェクトはスコープから外れていて、スレッドがそれを処理する前に破壊されています。 shared_ptr<socket>を使用するか、コンテナ内に保管してください。

+0

あなたはそうです。ありがとう。 – leezii

関連する問題