problem z odbieraniem danych typu int z serwera w C

0

Mam taki problem. Robię klienta (aplet) w Javie i serwer w C. Przez ten serwer ma się ze sobą komunikować dwóch klientów grających ze sobą. W jaki sposób zrobić żeby liczby typu int były dobrze odbierane? Próbowałem robić jak przedstawiono klienta i serwer chyba w 7 poście w tym temacie http://4programmers.net/Forum/viewtopic.php?id=142144 ale to działa jeśli serwer jest też w Javie, gdy serwer jest w C wtedy wypisywane są jakieś inne dziwne liczby. Co zrobić żeby dwóch klientów komunikowało się dobrze przez serwer w C???

0

Prawdopodobnie chodzi o to:

http://www.codeguru.com/java/articles/366.shtml

0

tylko wtedy warto wysłać sobie również jaki jest endianess serwera.

0

Warto też pamiętać o tym że w Javie liczby zapisywane są w systemi dopełnienia do dwóch
w C chyba tak nie jest, ale głowy nie daje.

Sprawdziłem i dobrze, że "nie dałem głowy" ;) No, ale mimo wszystko warto o tym pamiętać.

0

Poza kwestią kolejności bajtów najważniejsze, co do czego trzeba się upewnić, to czy rozmiar liczb int wysyłanycxh/odbieranych przez serwer w C/C++ jest taki sam jak rozmiar int w Javie (zawsze 32-bity). Po stronie Javy wszystko jest sztywne, więc problem może występować tylko po stronie C/C++. Co do liczb U2 oraz signed i unsigned w Javie i C/C++, to ich wartości nie ulegają zmianie bo konwersja z jednego systemu na drugi jest trywialna (nie zmienia wartości bitów liczby). O ile rozmiary i kolejności bajtów są takie same.

0

Trochę kombinowałem i teraz jest że niektóre liczby odbiera dobrze a inne nie, odbierze dobrze kilka liczb potem jedną jakieś głupoty i potem znowu parę liczb dobrze odbiera itd...

0

To pochwal się kluczową częścią kodów, którą wykombinowałeś srv/cli. Bo tak to forumowicze będą ci snuć domysły w ciemno, a to o ile sam wcześniej się z tym nie uporasz nie ma większego sensu.

0

Wyślij z serwera ciąg liczb naturalnych, a następnie odbierz go klientem i każdy bit odebranych danych wrzuć sobie do loga - najlepiej w postaci szesnastkowej. Analiza odebranego wyniku łatwo podpowie Ci, gdzie jest błąd komunikacji. Dość prawdopodobne jest, że serwer wysyła nadmiarowe dane kontrolne, o których Twój klient javowy nie ma najmniejszego pojęcia. Dlatego co jakiś czas odbierasz poprawne i niepoprawne dane. Ale jak napisał kolega wyżej - są to tylko spekulacje bez większej wartości. Podaj więc kod wysyłający i odbierający po obu stronach. Wtedy szybko pomożemy.

0

Po stronie serwera w C musisz zmienić kolejność bajtów na sieciową za pomocą funkcji htonl i przy odbiorze musisz stosować ntohl. Po stronie Javy nie musisz tego robić.

http://www.beej.us/guide/bgnet/output/html/multipage/htonsman.html
http://www.jguru.com/faq/view.jsp?EID=25977

0

dałem se rade, zmieniłem typy wysyłanych i odbieranych danych z int na byte i działa, zakres liczb typu byte wystarczy mi na numery kart i komunikaty

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