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



Teraz jest 28 mar 2024, o 17:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 7 sie 2014, o 22:17 
Offline
Użytkownik

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

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:

Składnia: [ Pobierz ] [ Ukryj ]
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:

Składnia: [ Pobierz ] [ Ukryj ]
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ł?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sie 2014, o 23:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

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:

Składnia: [ Pobierz ] [ Ukryj ]
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.



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

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

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::
Składnia: [ Pobierz ] [ Ukryj ]
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.

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sie 2014, o 17:26 
Offline
Użytkownik

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

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:

Składnia: [ Pobierz ] [ Ukryj ]
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...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sie 2014, o 06:11 
Offline
Użytkownik

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

Przepraszam za zamieszanie, już znalazłem przyczynę.
W przykładzie, na którym się opierałem zastosowano następującą konstrukcję:

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


Tymczasem powinno być:

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



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: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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