2009-11-11 6 views
5

Ich habe mit zwei Fehlern mit Boost.Asio zu kämpfen.Die Boost.Asio-Dokumentation ist nicht vorhanden. Was bedeuten diese Fehler?

Die erste tritt auf, wenn ich versuche, auf einem Socket zu empfangen Daten:

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" 

Die zweite tritt auf, wenn ich versuche, eine ip :: tcp :: Socket von einem (gültig!) Nativen Socket zu erstellen:

Mit all diesen Problemen und keine Dokumentation zu wenden, bin ich versucht, zurück zu BSD-Sockets zu gehen, aber ich habe meine eigenen Probleme dort ... also wenn jemand helfen kann, würde ich wirklich zu schätzen wissen es.

EDIT: Zu Nummer 2, nativeSocket thusly erklärt:

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

Danach, ein paar andere Dinge sind an die Buchse getan - nämlich als Einstellung nicht blockierende ioctlsocket und unter Verwendung setsockopt für SO_LINGER und SO_OOBINLINE.

+0

Können Sie die Deklaration/Initialisierung für nativeSocket geben? Ich denke, die Probleme mit prob 2 liegen damit. – rcollyer

+0

Sie haben es einfach hinzugefügt. –

+0

Für Ihre erste Frage: "Dateiende" zeigt normalerweise an, dass die Verbindung vom Peer geschlossen wurde. –

Antwort

1

Dies ist keine vollständige Lösung für Ihr zweites Problem. Alle Fehler, die es generiert, sollten in eine boost::system::error_code gemappt werden, aber ich finde nichts dergleichen in boost/system/error_code.hpp, so bin ich ratlos, was genau es bedeuten soll.

Aber nach dem Durchschauen des Codes für Boost 1.39, assign wird schließlich entweder detail::reactive_socket_service< Protocol, Reactor >.assign (oder detail::win_iocp_socket_service<Protocol>, wenn Sie Windows verwenden) übergeben.

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

oder

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; 
} 

Da bist du nicht ein already_open Fehler bekommen, muss der Fehler aus dem zweiten Stück Code: Es kann nur einen Fehler an zwei Stellen in boost/asio/detail/reactive_socket_service.hpp produzieren. Der Reaktortyp kommt aus einer Folge von ifdef/elif Paaren in boost/asio/stream_socket_service.hpp, und von den verfügbaren nur die register_descriptor Funktion in epoll_reactor kann jeden Fehler werfen (und natürlich detail::win_iocp_socket_service<Protocol>.assign kann auch). Der Fehler in epoll_reactor kommt aus sys/epoll.h, speziell:

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

In der Windows-Implementierung, der zugehörige Code ist

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

Ich denke, das der Ursprung des Fehlers ist, aber ehrlich gesagt, kann ich nicht führe es über diesen Punkt hinaus.