Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 25 kwi 2024, o 18:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 19 sie 2014, o 18:44 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

Eksperymentując z językiem C pod Linuksem natknąłem się na kolejny problem.
Mianowicie napisałem prostą aplikację, która łączy się z serwerem MPD (daemon pełniący funkcję odtwarzacza muzycznego), parsuje dane i wyświetla informacje o muzyce na wyświetlaczu 2x16 (korzystając z biblioteki wiringPi). Cały kod jest tutaj:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Właściwie funkcje parsujące i wyświetlające są nieważne. Najważniejsze jest to, co dzieje się na początku funkcji main() oraz w jej pętli głównej. Szczególnie ważny jest tutaj fakt, że funkcja recv() pobiera do bufora komplet danych odsyłanych przez serwer..

Dzisiaj postanowiłem trochę upiększyć kod, wydzielając funkcje odpowiedzialne za łączność z MPD do osobnej biblioteki. Tak oto powstały dwa pliki:

mpdcl.h
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



mpdcl.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No i jeszcze plik z głównym kodem programu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ta wersja programu nie chce działać jak należy. Po godzinie zabawy udało mi się znaleźć przycyznę - zamiast całej wiadomości (jak przedtem) recv() odbiera tylko po kilka znaków. Ktoś wie, dlaczego tak się dzieje? Ustawienie flag MSG_WAITALL w niczym nie pomaga. Można by pewnie próbować odbierać poszczególne fragmenty w pętli, łącząc je potem, zupełnie jak na AVR-ach. Jednak przede wszystkim interesuje mnie dlaczego kod przestał działać. Przecież nadając komunikat za pomocą TCP wysyłam również iformację o jego długości, więc druga strona powinna wiedzieć, czego się spodziewać. Przecież przedtem działało jak należy... Coś się mogło "wyłączyć"?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2014, o 20:27 
Offline
Użytkownik

Dołączył(a): 02 lut 2014
Posty: 38
Lokalizacja: Jaworzno
Pomógł: 2

Atlantis napisał(a):
zamiast całej wiadomości (jak przedtem) recv() odbiera tylko po kilka znaków. Ktoś wie, dlaczego tak się dzieje?


rc = recv(sd, ans, sizeof(ans), MSG_WAITALL);

Zdaje się, że w tym przypadku sizeof(ans) == 4.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2014, o 21:08 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

gordo napisał(a):
Atlantis napisał(a):
zamiast całej wiadomości (jak przedtem) recv() odbiera tylko po kilka znaków. Ktoś wie, dlaczego tak się dzieje?


rc = recv(sd, ans, sizeof(ans), MSG_WAITALL);

Zdaje się, że w tym przypadku sizeof(ans) == 4.



Hmm... Z czego to wynika? Bo wydawało mi się, że do funkcji przekazałem bufor, który miał jakieś 1000 znaków pojemności...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2014, o 08:07 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

mokrowski napisał(a):
Przy przesyłaniu wskaźnika do funkcji, nie jest przesyłana informacja o wielkości bufora/tablicy na którą on ew. wskazuje. Typ traci informację o wielkości danych. A że wskaźnik jest na adres 32-bitowy, to i wielkość jest 4 bajty. Poza tym sizeof() to operator.


Oczywiście masz rację, przepraszam za zamieszanie.
Chciałbym przy tej okazji zapytać o jedno. Czy informacja o wielkości jest też tracona w przypadku przekazywania tablicy wchodzącej w skład struktury przez wskaźnik na tą strukturę. Czy konstrukcja sizeof(wskaźnik_na_strukture->tablica) zwróci prawidłową wartość?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2014, o 08:58 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

Odpowiedz jest prosta i w wynika z pierwszego pytania, a jesli nie widzisz jej to w 5 minut to sobie sprawdzisz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2014, o 10:22 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

W porządku, już sprawdziłem. Tak jak podejrzewałem - informacja jest przekazywana.
Czyli to chyba faktycznie najlepszy sposób na przekazywanie większej ilości danych "w dół", do kolejnych funkcji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO