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