Wpis z mikrobloga

Cześć,
Uczę się korzystania z protokołów UDP / TCP w c. Mam napisany prosty przykład komunikacji server - client (w UDP) i obydwa programy mi się kompilują, serwer wysyła określoną ilość bajtów (bo funkcja sendto() zwraca dodatnią wartość), a klient bez errorów dochodzi do momentu recvfrom() i czeka nic nie odbierając. Byłby ktoś chętny rzucić okiem na kod? Myślę, że problem tkwi gdzieś w nadawaniu adresów, ale tkwię w tym miejscu już drugi dzień i skończyły mi się pomysły :/
#tcpip #programowanie #naukaprogramowania #udp #siecikomputerowe
  • 10
@Inboxie: obydwa programy mam zezwolone, przed chwilą próbowałem też wyłączyć kompletnie firewall, ale nic to nie dało.
@bi-tek:
Plik serwera:
https://4programmers.net/Pastebin/7283
Plik klienta:
https://4programmers.net/Pastebin/7284
Używam Codeblocks i tam na poziomie projektu załączam WS232, dlatego nie ma tego w kodzie. Z tego co udało mi się wyczytać w sieci, pewnie źle użyłem INADDRANY, ale na razie nie wiem w którą stronę iść dalej
@vroobelle: INADDRANY to znaczy że walisz wszystko na broadcast i odbierasz z broadcasta a nie z "każdego adresu" to tak nie działa.

Wysyłasz na --> serv
addr.sinaddr.saddr = inetaddr("127.0.0.1");
Odbierasz z <--- serverAddr.sin
addr.saddr = INADDRANY;

Powyższe liniki powinne być takie samie.

To tak jak byś dzwonił do Cioci i chciał coś od wujka który nasł#!$%@? tylko od babci
@bi-tek: masz na myśli, że w obydwu linijkach powinno być inetaddr("127.0.0.1");?
Kiedy tak robię, dostaję w kliencie błąd przy bindowaniu, ponieważ ten adres jest już zajęty. Natomiast kiedy nie używam binda w kliencie, dostaję błąd "WSAEINVAL (10022) Invalid argument.", którego przyczyną jest brak zbindowania socketu dla połączenia DGRAM.
@vroobelle: Hmm... Dawno już nie bawiłem się winsockiem, musze pomyśleć ale pierwsze co mi przychodzi na myśl to bład przy bindowaniu.

W obu powinno być wysyłanie i dobieranie na localhoscie czyli 127.0.0.1 lub ip komputera w sieci lokalnej np 192.168.1.32 (przykład)

Wywal bindowanie z klienta, w serwerze bindujesz tylko z tego co pamietam.
@bi-tek: Generalnie co do serwera, to skoro sendto() zwraca ilość wysłanych bajtów, to można uznać, że działa poprawnie? Próbowałem sprawdzić Wiresharkiem czy coś nadaje, ale tam na Windowsie nie da się monitorować danych w obrębie tego samego komputera.
Co do bindowania w kliencie to istotnie- większość przykładów ma je tylko w pliku serwera. Zakomentuję więc. Spróbuję jeszcze pomajstrować przy recvfrom(), może podałem do funkcji jakiś nieprawidłowy argument...
@bi-tek: kurna, znalazłem. 3 dni się męczyłem xD Może napiszę o co chodzi, dla przyszłych pokoleń.
-w obydwu programach jest inetaddr("127.0.0.1"); komenda INADDR_ANY nie działa, jeszcze nie wiem czemu
- w kliencie rzeczywiście nie trzeba bindować, należy jednak wysłać coś na serwer przez sendto(), wówczas binduje się samo i nie robi problemów o to że w obydwu programach podaliśmy ten sam adres IP