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:
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
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
mpdcl.c
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:
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ć"?