Hello Ivan!
At Thu, 26 Feb 98 01:45:10 +0300, Ivan Frolcov wrote:
>>> Через сокет, объявленный таким образом, передается не более 2 Кб !8-0
>>> ПОЧЕМУ ?!!!
AK>> Как известно, протокол tcp/ip не сохраняет границ сообщений. Модуль
AK>> протокола сам решает, когда следует сформировать пакет и отправить
AK>> его в сеть/прикладному процессу. Т.о. вызов read на стороне сервера
AK>> считывает первый tcp пакет. Длина которого оказывается 2К, что
AK>> вполне разумно. Резюме: надо делать много read пока не прочитаешь
AK>> нужного числа байт.
IF> select + FIONREAD?
Хреново. Пошлется сообщение на 128K, модуль приемки скажет "не выбирает у
тебя - жди" и подвиснем... поэтому правильно так:
int mymsgread( int s, char* buf, int size )
{
int pos = 0, rest = size;
while( rest > 0 ) {
int got = read( s, buf + pos, rest );
if( got == 0 ) return pos;
if( got < 0 ) return -errno;
pos += got; rest -= got;
}
return pos;
}
А вообще грустно - правильно бы было для read() или recv() иметь соотв. ключ
- "читать заданное количество байт и не меньше, если не EOF и не ошибка".
-- Valentin Nechayev netch@lucky.net 2:463/1966.300 -- end of forwarded message --