Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
Ой блин, пакеты частями приходить могут ? 07.05.02 17:26 Число просмотров: 894
Автор: vp016 Статус: Незарегистрированный пользователь
|
> Значит TCP/IP. Возможен ли приход пакетов "неожидаными" > порциями ? > Например послал я 100 байт. На принимающей стороне стою в > цикле, допустим, по 50 байт. Как только меньше - прием > закончен. Теоретически возможно что recv прочитает, > например 10 байт так оно и есть. особенно это проявляется для разного рода лабуды связанной с
http.
|
<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 вернёт столько сколько есть
в случае неблокирующего сокета вобщем та же ситуация, только ждать соответствующие события нужно
короче говоря нехорошо забивать на передачу размера блока :)
|
|
|