C:citanie zo socketu "na pozadi"

Programovacie jazyky, rady, poradňa...
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

C:citanie zo socketu "na pozadi"

Príspevok od používateľa Mek »

Pustil som sa do semestralky, kde mam nakodit v C pod linuxom chatovaci program - ma klientsku a serverovu cast. Klient sa pripoji na server, a potom obaja mozu posielat aj prijimat spravy. Problem je v tom, ze nemozem zaroven citat zo socketu aj cakat na vstup od uzivatela (spravu), kedze fgets pozastavi program, kym user nieco nezada. Zo socketov som uz spravil non-block sockety, este potrebujem vyriesit tento problemik. Vstup od usera citam takto:

Kód: Vybrať všetko

fgets(sprava,BUFFER_SIZE-1,stdin);
konstanta BUFFER_SIZE je 1024.
Ak to nie je este jasne, tak objasnim na priklade klasickeho chat klienta - tam mozete pisat a zaroven medzitym ako pisete, vam prichadzaju spravy. Sprava sa posle, az ked stlacite enter.
Tak taketo nieco potrebujem, vie niekto, ako na to...?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Určite tam máš neblokujúce sockety? Ak by tam naozaj boli, tak by to nemala zablokovať ani tá funkcia fgets. Inak môžeš použiť select, prípadne sa môžeš pozrieť na epoll.
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Príspevok od používateľa Mek »

Hej, mam tam neblokujuce sockety. Vidis, ani mi nenapadlo, ze by to malo aj na ten fgets mat ucinok. Ale aj tak sa to sprava divne, asi mam chybu este niekde inde (len kde :? )
Este jedna vec: je nejaky prostriedok, ako detekovat, ze server uz zanikol? Lebo teraz ked sa klient pripoji k serveru a server zrusim napr. cez ctrl-C, tak klient ostane visiet a tvari sa ako keby nic :?

//edit: vyzera to, ze ten fgets to aj tak blokuje, neviem si to vysvetlit. Ked poslem zo servera na klienta (alebo naopak, je to jedno) spravu, tak ta sa zobrazi az potom, co na tuto spravu odpovedam (tj. "uspokojim" fgets) :x
Prílohy
sem2.rar
(neverim, ze sa niekomu bude chciet sa na to kuknut ale za pokus to stoji)
(1.53 KiB) 28 stiahnutí
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Nie je problém to, že fgets čaká na znak '\n'?

Tvoje volanie fgets nie je neblokujúce (keďže pre stdin je štandardne nastavené blokovanie).
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Príspevok od používateľa Mek »

Nuz ano, to by mohol byt ten problem. Ale ako na to, ked chcem, aby sa spravy odosielali enterom? :?
to volanie fcie fcntl som medzitym opravil tak, ze som vypol blokovanie pred while cyklom a zapol ho zase za nim, mal som to tam dane zbytocne v cykle...

//edit: a este som to skusil takto:

Kód: Vybrať všetko

		fcntl((int)stdin, F_SETFL, O_NONBLOCK);
pred cyklom while a to iste ale so zapnutim blokovania pre stdin po while cykle, no sprava sa to stale rovnako.

//autoeditácia príspevku ( 16 Nov 2008, 21:37 )
Vyzera to, ze som to poriesil - dal som tam volanie fork(), pricom rodic zapisuje do socketu a syn cita. Este musim poriesit ukoncovanie potomkov, ale zda sa, ze je to na dobrej ceste :idea:
Napísať odpoveď