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:

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ł?

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:

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.

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::
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.

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:

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...

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ę:

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.

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/