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?
- 2763 megtekintés
Hozzászólások
fgets
- A hozzászóláshoz be kell jelentkezni
Az fgets jó, de ha egyszer csak read helyett SSL_read-et szeretnék, akkor már nem jó. Tehát én szeretnék írni egy függvényt, ami sort ad vissza, és jelenleg épp a read-et használja. A kérdésem az, hogy hogyan érdemes.
- A hozzászóláshoz be kell jelentkezni
a baratod a read+select kombo
/* bocs az esetleges helyesirasi hidakert */
- A hozzászóláshoz be kell jelentkezni
Lehet, hogy rosszul tudom, de a select nem a blokkolódást hívatott elkerülni? Az én kérdésem az, hogy mennyit kell beolvasnom ahhoz, hogy sorvége jelet kapjak, anélkül, hogy beolvasnék... ami nyilván nem lehetséges, ezért a fenti téma.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni