информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Массовый взлом SharePoint 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Ой блин, пакеты частями приходить могут ? 06.05.02 17:32  Число просмотров: 1012
Автор: 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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach