Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
71 / 48 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
1

Как Winsock понимает, что пришел последний пакет сообщения

04.10.2019, 15:04. Показов 1274. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,

Так потихоньку почитываю про Winsock, и вот наткнулся вот на такой фрагмент:

C++
1
2
// Ждём ответа
 int len = recv (s, (char *) &buff, MAX_PACKET_SIZE, 0); // читает входящий IP пакет размером 65535 байта и записывает в buff.
Если мы запросим у удалённого Web-сервера не такой маленький кусочек HTML-кода, как в нашем примере, а немного побольше, чем размер ip пакета, то есть больше 65535 байт, то мы получим только первую порцию данных от сервера. Остальная часть данных будет, скорее всего, утеряна.
Выход из данного положения очень прост. Он основан на знании принципа работы HTTP и TCP/IP протоколов, плюс некоторых особенностей Winsock. В нашем случае Web-сервер, передав последнюю порцию данных, закроет соединение. А функция recv в таком случае, после получения последнего фрагмента данных, возвращает ноль. Вывод напрашивается сам: мы должны читать входящие данные до тех пор, пока функция recv не вернет ноль.
Подскажите пожалуйста, как функция recv понимает, что пришел последний пакет сообщения от удаленного сервера или клиента ?
Только потому удаленный сокет был закрыт, или где то в пакете передается сообщение о длине всего сообщения которое должно прийти ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2019, 15:04
Ответы с готовыми решениями:

Данные на сервер передаются, но PHP не понимает что пришел именно файл..
Нужно: передать файл (картинка.жпг) на сервер методом POST (принимает индекс.пхп) Делаю: ...

Как отсылать и получать сообщения с помощью WinSock?
Как отсылать и получать сообщения с помощью WinSock Спасибо

Как отследить, что юзер пришел именно с конкретной страницы с формой?
В моей книге было описано, как предохраниться от следующего: юзер набиреат полный путь в строке...

Как компьютер понимает, что он подключен к интернету?
Интернет - это объединение всех компьютеров в одну сеть, чтобы информацию из одного компьютера...

8
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
04.10.2019, 15:35 2
Цитата Сообщение от Optimus11 Посмотреть сообщение
Подскажите пожалуйста, как функция recv понимает, что пришел последний пакет сообщения от удаленного сервера или клиента ?
Только потому удаленный сокет был закрыт, или где то в пакете передается сообщение о длине всего сообщения которое должно прийти ?
Блокирующий recv вернёт ноль, только когда другая сторона разорвёт соединение. Там вроде так и написано.
Если соединение не закрывать, то никах последних пакетов нет - tcp это непрерывный поток данных.
1
71 / 48 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
04.10.2019, 15:54  [ТС] 3
А как же незнаю харанее размера входящего сообщения выделить размер buff ?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
04.10.2019, 15:56 4
Цитата Сообщение от Optimus11 Посмотреть сообщение
А как же незнаю харанее размера входящего сообщения выделить размер buff ?
Зависит от протокола.
В случае xml/html - просто начитываешь документ кусками, до завершающей скобки >
1
71 / 48 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
04.10.2019, 21:40  [ТС] 5
Понял.Спасибо!

Добавлено через 5 часов 23 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Зависит от протокола.
В случае xml/html - просто начитываешь документ кусками, до завершающей скобки >
А если передается просто какой то бинарный файл ?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
04.10.2019, 22:13 6
Цитата Сообщение от Optimus11 Посмотреть сообщение
А если передается просто какой то бинарный файл ?
Просто, само по себе, ничего не передаётся.
Кто-то тебе их передаст в определённом формате и, для бинарных данных, где-то будет предаваться их размер.
Это от сокетов уже никак не зависит.
1
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
05.10.2019, 09:39 7
Цитата Сообщение от Optimus11 Посмотреть сообщение
Подскажите пожалуйста, как функция recv понимает, что пришел последний пакет сообщения от удаленного сервера или клиента ?
в случае с TCP приходит TCP пакет с флагом FIN, что означает, что удалённый хост хочет закрыть соединение.

Цитата Сообщение от Optimus11 Посмотреть сообщение
Только потому удаленный сокет был закрыт, или где то в пакете передается сообщение о длине всего сообщения которое должно прийти ?
длина всего сообщения не передаётся через IP или TCP. эту информацию можно передать только в протоколе прикладного уровня. как выше сказали, например, в XML/HTML/HTTP/etc. в некоторых из них длина всего сообщения кодируется в заголовке протокола(HTTP), в некоторых это понятно из анализа пакетов(XML/HTML).
и из всего вышесказанного становится понятно, что функция recv не понимает, что пришёл последний пакет, т.к. это не её задача.
1
71 / 48 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
07.10.2019, 12:46  [ТС] 8
А можно ли как то подсчитать время между двумя пришедшими пакетами ?
0
71 / 48 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
08.10.2019, 13:51  [ТС] 9
Имел ввиду конечно не ip пакеты, а tcp сегменты.
0
08.10.2019, 13:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2019, 13:51
Помогаю со студенческими работами здесь

WinSock отправка сообщения из Edit
Программа клиент должна передавать на сервер сообщение которое содержится в Edit. Есть примеры...

Как паскаль понимает что входное число отрицательное?
Сегодня был экзамен в универе по программированию. Меня спросили как паскаль понимает что двоичное...

Как сервлет понимает, что именно он обрабатывает запрос?
Есть страничка, на ней форма, по submit мы переходим на сервлет в соответствии с action и method....

winsock - клиент\сервер (теряется часть сообщения)
Доброго времени суток. Столкнулся с такой проблемкой: с клиента посылаю сообщение с текстом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru