ATNEL tech-forum https://forum.atnel.pl/ |
|
komunikacja po TCP https://forum.atnel.pl/topic8058.html |
Strona 1 z 1 |
Autor: | Atlantis [ 7 sie 2014, o 22:17 ] |
Tytuł: | komunikacja po TCP |
Mam problem z komunikacją po TCP. Próbuję napisać klienta MPC (Music Player Daemon) na Raspberry Pi, który w zamyśle ma wyświetlać kilka informacji na LCD. Zanim jednak przejdę do parsowania danych i sterowania wyświetlaczem, muszę sprawić, że popłyną dane. Z samym zainicjowaniem połączenia nie ma problemu. Program tworzy socketa i nawiązuje połączenie. Udaje mi się wysłać też pierwszą wiadomość. Potem zaczynają się dziać dziwne rzeczy... Program powstał na bazie jakiegoś przykładu z Internetu. Kłopotliwy fragment wygląda następująco: język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Efekt działania programu wygląda następująco: Kod: Client-socket() OK Connection established... Sending command currentsong to the server localhost... Client-write() is OK String successfully sent lol! Waiting the localhost to echo back... 1 bytes received OK MPD 0.16.0 file: Janis Jop 1 bytes received lin - 18 essential songs/18-M 1 bytes received e And Bobby McGee.mp3 Last-Mo 1 bytes received dified: 2006-03-23T09:55:41Z 1 bytes received Time: 237 Artist: Janis Jopli 1 bytes received n Title: Me And Bobby McGee A 1 bytes received lbum: 18 essential songs Trac 1 bytes received k: 18/18 Genre: Psychedelic R 1 bytes received ock Pos: 37 Id: 37 OK delic R Potem nie dzieje się kompletnie nic. Nie wywala błędu, nie wychodzi z programu - po prostu kursor stoi w miejscu, a żadne dane nie napływają, chociaż teoretycznie program po odebraniu i wyświetleniu wszystkich przychodzących danych powinien wysłać kolejnego requesta i zacząć cały proces od nowa. Wygląda to tak, że zawieszenie działania następuje gdzieś w trakcie wykonywania tego fragmentu: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Nigdy nie dochodzi do wyświetlenia wiadomości "koniec odbioru". Ktoś ma jakiś pomysł? |
Autor: | atmel [ 7 sie 2014, o 23:00 ] |
Tytuł: | Re: komunikacja po TCP |
Zapewne funkcja "read" oczkuje na odbiór danych i na tej podstawie wykonywane są dalsze działania. Pewnie nie jest w stanie odebrać "nic" i zwrócić wartość 0, która przerwałaby działanie pętli. W tym przypadku jedyne co mi na szybko przychodzi do głowy to ustalenie pewnego timeout'u w stylu: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Oczywiście czas trzeba dobrać odpowiednio (najlepiej doświadczalnie ), a najlepiej użyć timer'ów. |
Autor: | xor [ 8 sie 2014, o 07:08 ] |
Tytuł: | Re: komunikacja po TCP |
W linii 32 jest dosyć istotny błąd, chociaż chyba nie związany z zawieszeniem programu, który powoduje, że ilość odczytanych bajtów jest 1. Zgodnie z priorytetem operatorów powinno być tak:: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Zresztą, może to być powodem zawieszania, wystarczy, że read() zwróci błąd. ~~~ (intensywne procesy myślowe) ~~~ ....chociaż nie, po przemyśleniu uważam jednak to nie to. Prawdopodobnie, jak kolega post wyżej zauważył, read() czeka na dane. Jeżeli jest to działanie nieporządane to proponuję zainteresować się flagami kontrolnymi funkcji open() a w szczególności O_NONBLOCK. |
Autor: | Atlantis [ 8 sie 2014, o 17:26 ] |
Tytuł: | Re: komunikacja po TCP |
Udało mi się nieco popchnąć sprawę do przodu. Teraz niby jakaś komunikacja występuje, ale nie taka, jak być powinna. Program prawidłowo reaguje tylko na pierwszą komendę, potem wariuje i nie widzi pozostałych... Cały kod programu wygląda następująco: język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Pod konsolą wygląda to następująco: Kod: Client-socket() OK Connection established... OK MPD 0.16.0 Type command: currentsong Sending command currentsong to the server localhost... Client-write() is OK String successfully sent Waiting for reply fromMPD server... Server response is: file: Frank Turner/Frank Turner - England Keep My Bones (2011)/07 - One Foot Before The Other.mp3 Last-Modified: 2011-06-27T19:26:46Z Time: 206 Artist: Frank Turner AlbumArtist: Frank Turner Title: One Foot Before The Other Album: England Keep My Bones Track: 7/12 Date: 2011 Genre: Alternative Pos: 1 Id: 1 OK Type command: stats Sending command stats to the server localhost... Client-write() is OK String successfully sent Waiting for reply fromMPD server... Server response is: ACK [5@0] {} No command given Type command: status Sending command status to the server localhost... Client-write() is OK String successfully sent Waiting for reply fromMPD server... Server response is: ACK [5@0] {} No command given Type command: play Sending command play to the server localhost... Client-write() is OK String successfully sent Waiting for reply fromMPD server... Server response is: ACK [5@0] {} No command given Type command: stop Sending command stop to the server localhost... Client-write() is OK String successfully sent Waiting for reply fromMPD server... Server response is: ACK [5@0] {} No command given Type command: Ktoś ma może jakiś pomysł, co może być nie tak? Dlaczego nie widzi prawidłowo moich komend? Pod telnetem wszystko działa... |
Autor: | Atlantis [ 9 sie 2014, o 06:11 ] |
Tytuł: | Re: komunikacja po TCP |
Przepraszam za zamieszanie, już znalazłem przyczynę. W przykładzie, na którym się opierałem zastosowano następującą konstrukcję: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Tymczasem powinno być: |
Strona 1 z 1 | Strefa czasowa: UTC + 1 |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |