LINUX.ORG.RU

чтение из сокета tcp/ip


0

0

такое дело... если я читаю из сокета 4 байта, клиент посылает 4 байта /протокол такой/, могу ли я быть уверен, что придут все 4 байта одновременно? теоретически, recv возвращает кол-во успешно прочитанных байт, если пришло < 4, надо дочитать оставшиеся. но! что есть 4 байта данных против всего пакета, в котором тока на определение портов уходит 4 байта + нехилое богатство, навешанное протоколом ip? одним словом сталкивался ли кто с такой ситуацией, когда малое кол-во данных разбивалось на порции по непонятным /во всяком случае мне неграмотному/ причинам? я не говорю, что я столкнулся, мне интересно, реально ли такое вообще?

★★★★★

если ты отправил 4 байта, то ты их получишь, возможно фрагментами по 1 байту, но ты их получишь в любом случае, если используется тсп.

anonymous
()

Если та сторона, которая отсылает эти байты будет делать это не одним вызовом send(), а несколькими, то вполне вероятно, что может быть такая ситуация, когда придёт только часть. Если же одним вызовом, то они будут в одном пакете.

Вообще, теоретически минимальная днина данных в IP-пакете 20 байт.

anonymous
()
Ответ на: комментарий от anonymous

ну это ясно, но это сугубо теоретический взгляд на дело! неужели ОС стоит высылать (40+1)*4 вместо (40+4), при минимальном хедере в, скажем, 40 байт?

Pi ★★★★★
() автор топика
Ответ на: комментарий от anonymous

высылается 4 байта ОДНИМ сендом

Pi ★★★★★
() автор топика

Скорее всего ты из tcp-сокета получишь 4 байта зараз, если они были посланы одним send-ом, но закладываться на это категорически нельзя.

Например когда я смотрю ЛОР, а канал сильно загружен, то сквид иногда отдает по 1-2 байта в секунду. Как такой ответ, подходит под твой вопрос?

> если ты отправил 4 байта, то ты их получишь, возможно фрагментами по 1 байту, но ты их получишь в любом случае, если используется тсп. anonymous (*) (14.03.2006 22:44:45)

Интересно, по воздуху ты их получишь, если тебе сетевой шнур выдернуть? "Гарантированность доставки в tcp" это немного не то, что подразумевается под "гарантированностью" в обыденном смысле.

TCP-протокол прекрасно шлет и по одному байту данных, пример: telnet. Соотношение размеров заголовка и данных здесь вообще нипричем.

ansky ★★★★★
()

Тебе этого никто не гарантирует, даже если в буфере Ос будут все 4 байта или больше вернуть recv может меньше, вроде это ни в каких стандартах не оговорено..

Скорее всего ты сразу получишь все в одном пакете, но попробуй еще алгоритм нагла отключить на сервере/клиенте. Хотя имхо это дурацкая идея просто читай в цикле пока все 4 байта не получишь и не заморачивайся ))

OxiD ★★★★
()
Ответ на: комментарий от OxiD

>Тебе это чисто теоретически интересно, или нет? ))

чисто теоретически. :)

Pi ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.