2009-11-11 8 views
5

Mam dwa błędy z Boost.Asio.Dokumentacja Boost.Asio nie istnieje. Co oznaczają te błędy?

Pierwszy pojawia się przy próbie odbioru danych na gnieździe:

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" 

Druga pojawia się przy próbie stworzenia ip :: tcp :: gniazdo z (ważne!) Gniazda ojczystego:

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" 

Z tymi wszystkimi problemami i brakiem dokumentacji, do której się zwracam, mam ochotę wrócić do gniazd BSD, ale mam tutaj swoje własne problemy ... więc jeśli ktoś może pomóc, to naprawdę doceniam to.

EDIT: Jeśli chodzi o numer 2, nativeSocket deklaruje wygląda następująco:

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

Po tym, kilka innych rzeczy są zrobione do gniazda - czyli ustawienie go jako non-blocking użyciu ioctlsocket, a przy użyciu setsockopt dla SO_LINGER i SO_OOBINLINE.

+0

Czy możesz podać deklarację/inicjalizację dla nativeSocket? Myślę, że problemy z prob 2 leżą w tym. – rcollyer

+0

Po prostu dodano. –

+0

Pierwsze pytanie: "Koniec pliku" zwykle oznacza, że ​​połączenie zostało zamknięte przez partnera. –

Odpowiedz

1

To nie jest kompletne rozwiązanie twojego drugiego problemu w jakikolwiek sposób. Wszelkie generowane błędy powinny być mapowane na boost::system::error_code, ale nie znajduję czegoś podobnego w boost/system/error_code.hpp, więc nie mam pojęcia, co dokładnie ma znaczyć.

Ale po przejrzeniu kodu dla zwiększenia 1.39, assign jest ostatecznie przekazywany do detail::reactive_socket_service< Protocol, Reactor >.assign (lub detail::win_iocp_socket_service<Protocol>, jeśli używasz systemu Windows). To może produkować tylko błąd w dwóch miejscach w boost/asio/detail/reactive_socket_service.hpp:

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

lub

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

Ponieważ nie jesteś otrzymuję błąd already_open, błąd musi od drugiego kawałka kodu. Typ reaktora pochodzi z sekwencji ifdef/ par w boost/asio/stream_socket_service.hpp, a spośród dostępnych tylko funkcji register_descriptor w epoll_reactor może zrzucić dowolny błąd (i oczywiście detail::win_iocp_socket_service<Protocol>.assign może również). Błąd w epoll_reactor pochodzi z sys/epoll.h, a konkretnie:

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

W implementacji systemu Windows, powiązany kod jest

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

myślę, że to jest źródłem swój błąd, ale szczerze mówiąc, nie mogę prześledzić ten punkt.

Powiązane problemy