информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяВсе любят медСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Google заблокировала 2 с лишним... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Ой блин, пакеты частями приходить могут ? 06.05.02 17:32  Число просмотров: 931
Автор: IgorR <Igor Razin> Статус: Member
<"чистая" ссылка>
ИМХО resv() прочитает столько, сколько успело прийти в сокет.
А у тебя было 10 байт из 100?
<programming>
Ой блин, пакеты частями приходить могут ? 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




Rambler's Top100
Рейтинг@Mail.ru


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