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

Quiero que un nuevo hilo maneje una nueva conexión. Pero en la función "func", el socket no está abierto y obtuve el "Descriptor de archivo incorrecto". Leí algunos ejemplos en el documento y en la web, pero son asíncronas. Creo que no es necesario para mi simple demanda.Tengo "Descriptor de archivo incorrecto" cuando uso boost :: asio y boost :: thread

¿Cómo puedo reparar el error? Cualquier ayuda es apreciada

+0

Posiblemente esto sucede porque el hilo principal ejecuta accept (socket) al mismo tiempo, ya que otro hilo intenta trabajar con el socket. Al pasar por referencia, está trabajando con la misma instancia de socket. –

+0

@AlexFarber No creo eso. Como uso solo un cliente para conectar el servidor, solo hay una conexión. – leezii

+0

Pero al mismo tiempo, cuando un cliente intenta trabajar con el socket, el hilo principal aplica accept operator al mismo socket. –

Respuesta

10

Su socket es un objeto temporal, le pasa un reffence pero el objeto sale del alcance y se destruye antes de que el hilo lo procese. Use shared_ptr<socket> o guárdelos en un contenedor.

+0

Tienes razón. Gracias. – leezii