2009-11-11 18 views
5

Estoy luchando con dos errores con Boost.Asio.La documentación de Boost.Asio no existe. ¿Qué significan estos errores?

El primero ocurre cuando intento para recibir datos de un conector:

char reply[1024]; 
boost::system::error_code error; 
size_t reply_length = s.receive(boost::asio::buffer(reply, 1024), 0, error); 
if (error) cout << error.message() << endl; //outputs "End of file" 

El segundo ocurre cuando intento crear una ip tcp :: :: toma de una toma nativa (válido!):

boost::asio::io_service ioserv; 
boost::asio::ip::tcp::socket s(ioserv); 

boost::system::error_code error; 
s.assign(boost::asio::ip::tcp::v4(), nativeSocket, error); 
if (error) cout << error.message() << endl; //outputs "The parameter is incorrect" 

Con todos estos problemas y sin documentación a la que recurrir, estoy tentado de volver a enchufes BSD, pero tengo mis propios problemas allí ... así que si alguien puede ayudar, realmente apreciaría eso.

EDIT: en cuanto al número 2, nativeSocket se declara así:

SOCKET nativeSocket = INVALID_SOCKET; 
nativeSocket = accept(svr_sock, (struct sockaddr*)&sin, &size); 

Después de eso, algunas otras cosas se hacen a la toma - a saber, configurándolo como no bloqueante usando ioctlsocket, y usando setsockopt para SO_LINGER y SO_OOBINLINE.

+0

¿Puede dar la declaración/inicialización para nativeSocket? Creo que los problemas con el problema 2 se encuentran en eso. – rcollyer

+0

Acaba de agregarlo. –

+0

Para su primera pregunta: "Fin del archivo" normalmente indica que la conexión fue cerrada por el par. –

Respuesta

1

Esto no es una solución completa a su segundo problema de ninguna manera. Cualquier error que genere se debe mapear en un boost::system::error_code, pero no encuentro nada parecido en boost/system/error_code.hpp, por lo que no sé qué significa exactamente.

Pero, después de revisar el código para boost 1.39, assign se transfiere eventualmente a detail::reactive_socket_service< Protocol, Reactor >.assign (o detail::win_iocp_socket_service<Protocol>, si usa Windows). Sólo se puede estar produciendo un error en dos lugares en boost/asio/detail/reactive_socket_service.hpp:

if (is_open(impl)) 
{ 
    ec = boost::asio::error::already_open; 
    return ec; 
} 

o

if (int err = reactor_.register_descriptor(
     native_socket, impl.reactor_data_)) 
{ 
    ec = boost::system::error_code(err, 
     boost::asio::error::get_system_category()); 
    return ec; 
} 

Puesto que, usted no está consiguiendo un error already_open, el error debe partir de la segunda parte del código. El tipo de reactor proviene de una secuencia de ifdef/elif pares en boost/asio/stream_socket_service.hpp, y de aquellos disponibles solo la función register_descriptor en epoll_reactor puede arrojar cualquier error (y por supuesto detail::win_iocp_socket_service<Protocol>.assign puede, también). El error en epoll_reactor proviene de sys/epoll.h, específicamente:

int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev); 
if (result != 0) 
    return errno; 

En la implementación de Windows, el código relacionado es

if (iocp_service_.register_handle(native_socket.as_handle(), ec)) 
    return ec; 

Creo que este es el origen de su error, pero, honestamente, no puedo rastrearlo más allá de este punto.

Cuestiones relacionadas