Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как избежать переполнения буфера, при чтении из сокета? 
:(
    Опции темы
Coder
Дата 18.1.2007, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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.
...

Пишу такой код для того чтобы не переполнить буфер и считать все данные:

Код

    // выделяем память под буфер
    char *from_client;
    from_client=(char *)malloc(MEM_TO_ALLOC);
    ZeroMemory(from_client,MEM_TO_ALLOC);
    //
    int iReturn;
    iReturn = recv(S, from_client, MEM_TO_ALLOC, 0);
    while (iReturn == WSAEMSGSIZE){
        // сохраняем буфер
        // читаем заново
    };
    ...


так вот даже при посылке больших пакетов, больших чем MEM_TO_ALLOC, программа никогда не заходит в цикл while.
А iReturn = MEM_TO_ALLOC и буфер все равно переполняется! Почему?
PM MAIL   Вверх
SergeCpp
Дата 18.1.2007, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 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.
PM MAIL WWW ICQ   Вверх
Coder
Дата 18.1.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



SergeCpp, попробую. Я читал про WSAGetLastError(), но не стал ее использовать т.к. в ее описании не приводится список возвращаемых значений и в стандартном примере от MS    iReturn сравнивается с WSAECONNRESET   без вызова WSAGetLastError
PM MAIL   Вверх
Coder
Дата 19.1.2007, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



не получается, WSAGetLastError возвращает 0 даже при переполнении
PM MAIL   Вверх
Dude03
Дата 19.1.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



recv возвращает количество считанных в буфер байт. Этого должно хватить для организации считывания без переполнения.
Просто каждый раз увеличивай указатель буфера, а количество незанятых байт в буфере уменьшай 
PM MAIL   Вверх
ptr
Дата 22.1.2007, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Цитата(Coder @  19.1.2007,  06:30 Найти цитируемый пост)
не получается, WSAGetLastError возвращает 0 даже при переполнении

recv не заботится о том переполнился ли твой буфер или нет. По умолчанию он считывает только то, что уже пришло, но не более указанного размера. Как уже было сказано recv возвращает количество считанных байт. И уже используя это ты должен следить чтобы буфер не переполнялся.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Coder
Дата 24.1.2007, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



Dude03, 
ptr, 
спасибо. проблема решилась.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.4550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.