информационная безопасность
без паники и всерьез
 подробно о проекте
Сетевые кракеры и правда о деле ЛевинаСтрашный баг в WindowsГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Вредоносный релиз LiteLLM 
 Мощные индийские ключи 
 Срочные патчи для критических уязвимостей... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Ой блин, пакеты частями приходить могут ? 06.05.02 15:13  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
Значит TCP/IP. Возможен ли приход пакетов "неожидаными" порциями ?
Например послал я 100 байт. На принимающей стороне стою в цикле, допустим, по 50 байт. Как только меньше - прием закончен. Теоретически возможно что recv прочитает, например 10 байт ?
Ой блин, пакеты частями приходить могут ? 08.05.02 07:06  
Автор: paul2k Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Значит TCP/IP. Возможен ли приход пакетов "неожидаными"
> порциями ?
> Например послал я 100 байт. На принимающей стороне стою в
> цикле, допустим, по 50 байт. Как только меньше - прием
> закончен. Теоретически возможно что recv прочитает,
> например 10 байт ?

устанавливается флажок фрагментации, и стек честно ждет оставшиеся фрагменты после чего собирает настоящий живой пакет.
внутри 07.05.02 23:24  
Автор: SINоptiK Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Значит TCP/IP. Возможен ли приход пакетов "неожидаными"
> порциями ?
> Например послал я 100 байт. На принимающей стороне стою в
> цикле, допустим, по 50 байт. Как только меньше - прием
> закончен. Теоретически возможно что recv прочитает,
> например 10 байт ?

Возможно, но если он прочитал за один вызов только 10 байт значит должны придти еще 90, только для этого будет еще раз сформировано событие . А в принимающей стороне не стоит просто в цикле крутиться, иначе при ошибке данные будут искажаться .. отсюда глюки :)

я юзаю на принимающей стороне функцию типа такой для приема сообщений фиксированной длины :

int readn(SOCKET fd, char* bp, int len) {
int cnt;
int rc;
int errono;

cnt = len;
while (cnt > 0)
{
rc = recv(fd, bp, cnt, 0);
if (rc < 0)
{
errno = WSAGetLastError();
if (errno == WSAEINTR)
continue;
return -1;
}

if (rc == 0)
return len - cnt;

bp += rc;
cnt -= rc;
}
return len;
}
Ой блин, пакеты частями приходить могут ? 07.05.02 17:26  
Автор: vp016 Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Значит TCP/IP. Возможен ли приход пакетов "неожидаными"
> порциями ?
> Например послал я 100 байт. На принимающей стороне стою в
> цикле, допустим, по 50 байт. Как только меньше - прием
> закончен. Теоретически возможно что recv прочитает,
> например 10 байт
так оно и есть. особенно это проявляется для разного рода лабуды связанной с
http.
Ой блин, пакеты частями приходить могут ? 06.05.02 17:32  
Автор: IgorR <Igor Razin> Статус: Member
<"чистая" ссылка>
ИМХО resv() прочитает столько, сколько успело прийти в сокет.
А у тебя было 10 байт из 100?
Цифры привел абсолютно с балды 06.05.02 22:22  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
> А у тебя было 10 байт из 100?

Ни разу не видел :) Вот и думаю - а может ли такое быть в природе ? :)
Всегда посылал первыми байтами размер пакета. А тут поленился... Вот и думаю теперь чем это грозить может.
Ой блин, пакеты частями приходить могут ? 06.05.02 16:11  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
> Значит TCP/IP. Возможен ли приход пакетов "неожидаными"
> порциями ?
> Например послал я 100 байт. На принимающей стороне стою в
> цикле, допустим, по 50 байт. Как только меньше - прием
> закончен. Теоретически возможно что recv прочитает,
> например 10 байт ?

сколько попросишь, столько и прочитает :)
блокирующий сокет читает столько сколько скажешь, пока не случится ошибка (закроется соединение)
Вобще-то читает столько сколько есть 06.05.02 22:19  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
Т.к. я не знаю сколько должно придти, то читаю до тех пор пока не даст меньше чем прошу.
Только вот сомнение есть - может прочесть меньше, а потом в него еще довалится, а я уже с него свалю. Плохо будет...
Вобще-то читает столько сколько есть 06.05.02 23:39  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
> Т.к. я не знаю сколько должно придти, то читаю до тех пор
> пока не даст меньше чем прошу.
> Только вот сомнение есть - может прочесть меньше, а потом в
> него еще довалится, а я уже с него свалю. Плохо будет...

насколько помню по своему опыту (если склероз не изменяет) :)
когда я пытался прочитать из_блокирующего_сокета данных больше, чем послано, при условии, что соединение на обоих сторонах_не_закрыто_ то прога висла в recv, ожидая данные
если же отправитель закрыл сокет, то recv вернёт столько сколько есть

в случае неблокирующего сокета вобщем та же ситуация, только ждать соответствующие события нужно

короче говоря нехорошо забивать на передачу размера блока :)
1





Рейтинг@Mail.ru


  Copyright © 2001-2026 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach