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

Ich möchte einen neuen Thread behandeln neue Verbindung. Aber in der Funktion "func" ist der Socket nicht geöffnet und ich habe "Bad file descriptor". Ich lese einige Beispiele im Dokument und im Web, aber sie sind asynchron. Ich denke, dass es für meine einfache Nachfrage nicht notwendig ist.Bekam "Bad file descriptor", wenn boost :: asio und boost :: thread verwenden

Wie kann ich den Fehler beheben? Jede Hilfe wird geschätzt.

+0

Möglicherweise geschieht dies, weil der Hauptthread accept (socket) gleichzeitig ausführt, während ein anderer Thread versucht, mit dem Socket zu arbeiten. Wenn Sie als Referenz übergeben, arbeiten Sie mit derselben Socket-Instanz. –

+0

@AlexFarber Das glaube ich nicht. Da ich nur einen Client verwende, um den Server zu verbinden, gibt es nur eine Verbindung. – leezii

+0

Wenn jedoch ein Client versucht, mit dem Socket zu arbeiten, wendet main thread accept operator auf denselben Socket an. –

Antwort

10

Ihr Socket ist ein temporäres Objekt, Sie übergeben ihm einen Verweis, aber das Objekt wird aus dem Bereich entfernt und zerstört, bevor der Thread es verarbeitet. Verwenden Sie shared_ptr<socket> oder bewahren Sie sie in einem Behälter auf.

+0

Sie haben Recht. Vielen Dank. – leezii