Dziwny problem z C socket

0

Witam,
mam taki problem (klient <-> serwer):

  • localhost: połączenie i wymiana danych dział;
  • połączenie 2 komputerów bezpośrednio kablem: połączenie i wymiana danych dział;
  • połączenie przez router 2 komputerów: połączenie działa, ale przy wymianie danych serwer dostaje nie znany kod (serwer ma kody sterujące, są to rozkazy zadań jakie wysyła klient) i następuje segment fault.
    Problem jest taki, że nie mam non stop możliwości przetestowania 3 przypadku (2 VM chyba nie pomogą z wewnętrzna siecią?)
    Czy problem tkwi w przesyłanym pakiecie, który em ma inny format?
0

Problem jest taki, że nie mam non stop możliwości przetestowania 3 przypadku

Nie masz w domu rutera? To jak wygląda Twoja sieć domowa? Bo jeśli jednak masz, to jak otworzysz w windowsie konsole i wpiszesz ipconfig to dostaniesz między innymi adres lokalny Twojej obecnej maszyny. I teraz jak Twój klient zagada na ten adres i port serwera to będziesz się komunikował przez ruter właśnie. Upewnij się tylko, że port serwera jest też udostępniany przez ruter - większość ruterów z którymi ostatnio się spotkałem blokuje wszystkie porty z wyjątkiem 80 i 443 które są zajęte przez serwer administracyjny rutera.

Czy problem tkwi w przesyłanym pakiecie, który em ma inny format?

TCP to TCP, nie znaczenia czy wysyłasz po lanie czy przez ruter. Masz babola w serwerze, a jakiego to Ci niestety nie wywróże bez kodu.

0

@trybot nie odpowiadaj na temat w komentarzach

Ogólnie to mam 1 laptop ;) i nie jestem w domu. Co do portów hm słuszna uwaga, ale przecież serwer nie dostał by wiadomości od klienta :/

Uruchom sobie wszystko lokalnie. Serwer zbuduj w trybie debug i uruchom pod debugerem - w każdym rozsądnym IDE łatwo to zrobić. Potem zrób zapytanie klientem i jak poleci Ci segfault debuger wypluje Ci stacktrace gdzie będziesz widział jaka była ostatnio zawłana funckja.

0

@several: właśnie lokalnie próbowałem wywołać sigsegv, ale nie wywaliło. Rano jeszcze raz będę testować

0

Jest trochę późno, więc możesz sobie nie zdawać sprawy jak przedstawiony przez Ciebie problem wygląda, więc streszczę go żebyś wiedział o co pytasz.

Raz mi działa a raz nie. Kodu nie pokaże, bo nie. Dlaczego mi nie działa?

Jak widzisz, mam za mało danych żeby Ci coś konkretnego podpowiedzieć.

0

@several: Rano zauważyłem, że nie testuje jednej funkcji. Pojawiły się broken pipe, które sądzę, że w miarę udało mi się naprawić (ale idk czy dobrze). Teraz problem przy sytuacji (komp1 -> router -> komp2) (choć podobny konfig, ale inny sprzęt działa) jest taki, że po połączeniu na serwer nie dochodzą inne pakiety i połączenie jest zrywane przez serwer.
kod

0

Czy problemem jest kolejności odbieranych pakietów, która jest zła?

0

OMG, ale sieka, pardon maj frencz.

  1. Mieszasz send, recv, write, read. Jedno albo drugie. Najlepiej recv i send. Mieszasz to też ze streamami, ale powiedzmy, że użycie << dla socketów jest nieco kłopotliwe.
  2. Sprarwdzaj ile bajtów zwraca Ci send/recv/read/write.
  3. Gołe new i delete dla tablic. Po co, skoro używasz tam gdzieś std::vector, on przecież ma interfejs a'la zwykła tablica.
  4. W handlerach sygnałów nie używaj strumieni. Jak koniecznie musisz tam robić IO, użyj write i read i korzystaj z STDOUT_FILENO.
  5. Nie szukałem tego dokładnie, ale Ty te handlery sygnałów gdzieś instalujesz w ogóle?
  6. Jak możesz użyj linuxfd i zmapuj sygnały na deskryptory plików, wpakuj je do polla, będzie łatwiej to obsługiwać.
  7. A jak już się poll pojawia...co powiesz na wzorzec projektowy reactor? Przyzwoita implementacja jest tu:
    http://www.dre.vanderbilt.edu/Doxygen/5.6/html/ace/
  8. Albo proactor, tu: http://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio.html aczkolwiek imho reactor będzie prostszy.

A jak toto zdebugować...ncat zamiast klienta lub serwera i patrzysz co lata. Ew. tcpdump bądź inny kablorekin (wireshark) też dadzą podobny efekt...

0

@alagner: dzięki za odpowiedź

"Nie szukałem tego dokładnie, ale Ty te handlery sygnałów gdzieś instalujesz w ogóle?"
tzn ?

"Gołe new i delete dla tablic. Po co, skoro używasz tam gdzieś std::vector, on przecież ma interfejs a'la zwykła tablica."
Tutaj już zmieniam, ale użyje statycznej tablicy char 2 demensions by przechowywać tekst.

"A jak już się poll pojawia...co powiesz na wzorzec projektowy reactor? Przyzwoita implementacja jest tu:
http://www.dre.vanderbilt.edu/Doxygen/5.6/html/ace/classACEEventHandler.html"
link nie działa ;) ale zastanowię się

1 użytkowników online, w tym zalogowanych: 0, gości: 1