Serwer boost::asio - Dziwne zachowanie kodu

Serwer boost::asio - Dziwne zachowanie kodu
0

Cześć. Próbuję stworzyć prosty, asynchroniczny serwer TCP, wzoruje się na pewnym przykładzie z dokumentacji boosta. Konkretnie chodzi mi o ten fragment:

Kopiuj
CServer(IOService, EndPoint);
/*std::list<CServer> Servers;
Servers.emplace_back(IOService, EndPoint);*/

Gdy tworzę ten obiekt normalnie zostaję zaspamowany komunikatem Accepted z funkcji liste, mimo że nawet nic nie próbuje się połączyć, natomiast gdy stworze obiekt przez listę async_accept prawidłowo się blokuje i czeka na connecta. Jaka jest przyczyna takiego zachowania? Czemu normalnie to nie działa?
Dodam że gdy skompiluję jakiś przykład (np. ten - http://think-async.com/Asio/boost_asio_1_10_6/doc/html/boost_asio/example/cpp11/echo/async_tcp_echo_server.cpp) wszystko działa dobrze.

Kod - http://pastebin.com/FxqbXTcx

mlyszczek
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Wrocław
  • Postów:167
0

Co jest w złego w poczciwych socketach BSD, ze aż boosta używasz?

edytowany 1x, ostatnio: mlyszczek
Zobacz pozostałe 3 komentarze
mlyszczek
Wciąż jest to zupełnie niepotrzebna zależność, która dodaje kolejny poziom abstrakcji, który jest mniej czytelny niż oryginalny. Naprawdę, czy na wywołanie dosłownie 3 funkcji trzeba robić jakieś dodatkowe abstrakcje, żeby tylko było obiektowo?
spartanPAGE
@mlyszczek pomijając to, że ten kolejny poziom abstrakcji pozwala na pisanie cross-platformowego kodu, który od podszewki kręci się wokół asynchroności w dzisiejszy (jak dla c++) sposób, to rzeczywiście jest to niepotrzebna zależność.
mlyszczek
A po co, jak sockety już same w sobie są przenośne bo każdy system je obsługuje. A sockety BSD już same w sobie są asynchroniczne, wystarczy ustawić socket jako O_NONBLOCK, albo sprawdzać jakimś select albo poll.
spartanPAGE
zrób mi i sobie przysługę i zobacz najpierw co to jest boost.asio i z czym to się je, bo inaczej ta dyskusja nie będzie miała sensu
Azarien
@mlyszczek: API socketów wygląda jakby powstało w 1983.. oh, wait.. a serio, to nie chodzi o to że są stare, tylko o to że zaprojektowane chaotycznie i aż kusi je opakować w coś bardziej uporządkowanego.
satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
3

Tworzysz nienazwany obiekt serwera TCP, więc zanim zaczniesz pollować io_service i jakikolwiek event trafi do jego kolejki wywoła się destruktor serwera. W metodzie Listen nie obsługujesz error code, a dostajesz tam ERROR_OPERATION_ABORTED i potem pewnie coś jeszcze.

edytowany 1x, ostatnio: satirev
0

@satirev Wielkie dzięki, nie zwróciłem na to uwagi :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.