![]() |
|
Модераторы: feodorv |
![]()
|
|
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
Читаю в MSDN про функцию recv():
.... If the datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and recv generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost; for reliable protocols, the data is retained by the service provider until it is successfully read by calling recv with a large enough buffer. ... Пишу такой код для того чтобы не переполнить буфер и считать все данные:
так вот даже при посылке больших пакетов, больших чем MEM_TO_ALLOC, программа никогда не заходит в цикл while. А iReturn = MEM_TO_ALLOC и буфер все равно переполняется! Почему? |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: нет Всего: 124 |
If an error occurs, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
|
|||
|
||||
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
SergeCpp, попробую. Я читал про WSAGetLastError(), но не стал ее использовать т.к. в ее описании не приводится список возвращаемых значений и в стандартном примере от MS iReturn сравнивается с WSAECONNRESET без вызова WSAGetLastError
|
|||
|
||||
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
не получается, WSAGetLastError возвращает 0 даже при переполнении
|
|||
|
||||
| Dude03 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.4.2006 Репутация: нет Всего: 6 |
recv возвращает количество считанных в буфер байт. Этого должно хватить для организации считывания без переполнения.
Просто каждый раз увеличивай указатель буфера, а количество незанятых байт в буфере уменьшай |
|||
|
||||
| ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
recv не заботится о том переполнился ли твой буфер или нет. По умолчанию он считывает только то, что уже пришло, но не более указанного размера. Как уже было сказано recv возвращает количество считанных байт. И уже используя это ты должен следить чтобы буфер не переполнялся. -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
Dude03,
ptr, спасибо. проблема решилась. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |