(fwd) Re: Проблемы с сокетами

Andrey Gerzhov (kittle@routki.ki.yurteh.net)
Wed, 4 Mar 1998 12:38:01 +0200 (EET)

-- forwarded message --
Path: routki.ki.yurteh.net!carrier.kiev.ua!demos!ddt.demos.su!fido-news-server
From: Valentin Nechayev <netch@lucky.net>
Newsgroups: fido7.ru.unix
Subject: Re: Проблемы с сокетами
Date: 26 Feb 1998 17:48:18 +0300
Organization: Lucky Net Ltd.
Lines: 36
Approved: <gateway@fido7.ru>
Distribution: fido7
Message-ID: <6d3v7q$um$3@news.lucky.net>
References: <888082346@f407.n5030.z2.ftn> <1330701575@p37.f23.n5020.z2.ftn>
NNTP-Posting-Host: ddt.demos.su
Mime-Version: 1.0
Content-Type: text/plain; charset=koi8-r
Content-Transfer-Encoding: 8bit
X-BeforeModerator-Path: burka.carrier.kiev.ua!netch
X-BeforeModerator-NNTP-Posting-Host: burka.carrier.kiev.ua
X-Comment-To: Ivan Frolcov
Xref: routki.ki.yurteh.net fido7.ru.unix:3044

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