2009-11-11 3 views
5

Sono in difficoltà con due errori con Boost.Asio.Boost.Asio documentazione inesistente. Cosa significano questi errori?

La prima si verifica quando si tenta di ricevere i dati su un socket:

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" 

Il secondo si verifica quando si tenta di creare un ip :: tcp :: presa da una presa di corrente (valido!) Nativo:

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 tutti questi problemi senza documentazione a cui rivolgersi, sono tentato di tornare alle prese BSD, ma ho i miei problemi lì ... quindi se qualcuno può aiutare, mi piacerebbe molto esso.

EDIT: Per quanto riguarda il numero 2, nativeSocket è dichiarato così:

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

Dopo di che, un paio di altre cose sono fatte alla presa - vale a dire, impostandola come non bloccante utilizzando ioctlsocket, e utilizzando setsockopt per SO_LINGER e SO_OOBINLINE.

+0

Puoi fornire la dichiarazione/inizializzazione per nativeSocket? Penso che i problemi con prob 2 si trovino in questo. – rcollyer

+0

Appena aggiunto. –

+0

Per la prima domanda: "Fine del file" indica normalmente che la connessione è stata chiusa dal peer. –

risposta

1

Questa non è una soluzione completa al tuo secondo problema con qualsiasi mezzo. Eventuali errori generati devono essere mappati in un boost::system::error_code, ma non trovo nulla di simile in boost/system/error_code.hpp, quindi non sono a conoscenza di cosa si intende esattamente.

Tuttavia, dopo aver esaminato il codice per la spinta 1.39, assign viene consegnato a detail::reactive_socket_service< Protocol, Reactor >.assign (o detail::win_iocp_socket_service<Protocol>, se si sta utilizzando Windows). Si può produrre solo un errore in due posti in 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; 
} 

Dal momento che, non stai ricevendo un errore already_open, l'errore deve partire dalla seconda porzione di codice. Il tipo di reattore proviene da una sequenza di coppie ifdef/elif in boost/asio/stream_socket_service.hpp e di quelli disponibili solo la funzione register_descriptor in epoll_reactor può generare qualsiasi errore (e ovviamente anche detail::win_iocp_socket_service<Protocol>.assign). L'errore in epoll_reactor viene da sys/epoll.h, in particolare:

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

Nell'implementazione di Windows, il relativo codice è

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

Penso che questa sia l'origine del tuo errore, ma onestamente, non posso tracciare oltre questo punto.