egy sor beolvasasa

Fórumok

Sziasztok!

Soronként szeretnék olvasni egy socket-ről Linux alatt ANSI C-ben.

read(2) alapján:
ssize_t read(int fd, void *buf, size_t count);

Szeretnék egy olyan függvényt, ami egy sort szolgáltat, legyen a neve readln. Hogyan írjam meg?

Nagyon gyenge megoldásnak számít bájtonként feltölteni egy dinamikusan növő text buffert? Nekem kellene megvalósítanom a pufferelést a soronkénti feldolgozáshoz (readln mindig 512 bájtot olvas read-del, és puffereli a "túlolvasott" bájtokat)? Hogyan érdemes?

Hozzászólások

a baratod a read+select kombo
/* bocs az esetleges helyesirasi hidakert */

Ha nem tudod előre milyen hosszú a sor, akkor MUSZÁJ minden
bájtot ellenőrizni. Két dolgot csinálhatsz:

1. bájtonként olvasol
2. blokkonként olvasol és figyeled a file_pointert.

Én az elsőt választanám, ha nem nagy az adatmennyiség és a
másodikat, ha az olvasás a szűk keresztmetszet. Ha pedig jó
programot akarnék írni, akkor az fgets-szel dolgoznék (-::

> Sol omnibus lucet.

Gyakorlatilag kezzel kellene implementalnod a fgets()-et.

Tehat: csinalsz egy buffert, adott merettel (mondjuk 4k), es azt mindig
teleolvasod adattal, majd ha kell egy sor, akkor vegigszaladsz rajta
es az elso" \n-ig bezarolag visszaadod a hivo bufferebe a cuccot,
maramennyiben van hely. Lehet hogy egyszerre tobb sor is belefer a 4k-ba, tehat mindenkepp a buffer mellett egy offset-szeruseget is tarolnod kell, hogy eppen hol tart a juzer a buffer kiolvasasaban. Es persze a teljes meret se biztos hogy 4k, lehet hogy kisebb (kevesebb adat all rendelkezesre).

Az SSL_read() eseten meg a blokkolodasra vigyazni kell. Amennyiben az adott socket-et a select() blokkolna', annak ellenere lehet hogy me'g van adat az SSL objektum belso" bufferebe. Ezt az SSL_pending()-gel lehet kikerulni.

Azaz amit normalisan igy csinalnal, hogy


while ( 1 )
 {   FD_ZERO(&set);
     FD_SET(sock,&set);
     ...
     select(MAX(&set)+1,&set,NULL,NULL,NULL);
     if ( FD_ISSET(sock,&set) )
      {     myfgets(sock,buffer,meret);
            ...
      }
 };

azt SSL mellett valahogy igy csinald:


while ( 1 )
 {   FD_ZERO(&set);
     FD_SET(socket,&set);
     ...
     if ( ! SSL_pending(sock_ssl) )
            select(MAX(&set)+1,&set,NULL,NULL,NULL);
     if ( SSL_pending(sock_ssl) || FD_ISSET(sock,&set) )
      {     myfgets_ssl(sock_ssl,buffer,meret);
            ...
      }
 };

Ahol a myfgets_ssl() mar tenyelg csak annyiban kulonbozik a myfgets()-tol hogy read(sock,...); helyett SSL_read(sock_ssl,...); van benne.