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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> libevent: bufferevent_read возвращает много байт 
:(
    Опции темы
REZiaMIX
Дата 9.8.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вызываю:
Код

client->getData().dataLength = bufferevent_read(bev, client->getBuffer(), rdBufferLen);


В доке указано:
Цитата

Returns:
    the amount of data read, in bytes. 


При этом указано:
Код

const uint32_t rdBufferLen = 1024*10;


После вызова кода:
Код

Client 0 writed 134516196 bytes of data


Код

size_t  len = EVBUFFER_LENGTH(evb->input);

Показывает именно данный объем.

134516196 ~= 128 мб;

Почему он читает столько объема, если я указываю rdBufferLen равный 10кбайтам(ну не могу же я на каждого клиента держать такой буффер!) ?


--------------------
user posted image
PM MAIL   Вверх
boostcoder
Дата 9.8.2010, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



попробуй так:
Код

int size = EVBUFFER_LENGTH(bev->input);
int rd = bufferevent_read(bev, buffer, size);

и покажи значения size и rd.

Это сообщение отредактировал(а) boostcoder - 9.8.2010, 17:40
PM WWW   Вверх
REZiaMIX
Дата 10.8.2010, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @ 9.8.2010,  17:13)
попробуй так:
Код

int size = EVBUFFER_LENGTH(bev->input);
int rd = bufferevent_read(bev, buffer, size);

и покажи значения size и rd.

Код

int size = EVBUFFER_LENGTH(bev->input);
char * buffer = new char[size];
int rd = bufferevent_read(bev, buffer, size);
printf("size: %i\nrd: %i\n",size,rd);

Цитата

size: 134549472
rd: 370



--------------------
user posted image
PM MAIL   Вверх
boostcoder
Дата 10.8.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



REZiaMIX, вопросы?
PM WWW   Вверх
REZiaMIX
Дата 13.8.2010, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @ 10.8.2010,  13:57)
REZiaMIX, вопросы?

Ну ведь по сути я указываю, что размер буффера - 1024*10, т.е. 10кб. А заместо этих 10ти кб мне выдает 134516196 байтов.
В случае с:
Код

int size = EVBUFFER_LENGTH(bev->input);
char * buffer = new char[size];
int rd = bufferevent_read(bev, buffer, size);
printf("size: %i\nrd: %i\n",size,rd);


я выделяю буффер размером size: 134549472, что многовато. Только тогда мне bufferevent_read возвращает нужное кол-во байт.
Но ведь если я укажу size равное 134549472, и предоставлю буфер размером 10кб , то это будет ошибкой. Будет переполнение.
А выделять такое кол-во памяти на клиента я не могу.


--------------------
user posted image
PM MAIL   Вверх
boostcoder
Дата 13.8.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(REZiaMIX @  13.8.2010,  11:31 Найти цитируемый пост)
я выделяю буффер размером size: 134549472, что многовато. Только тогда мне bufferevent_read возвращает нужное кол-во байт.

по моему - нет.
попробуйте так:
Код

char * buffer = new char[нужное кол-во байт];
int rd = bufferevent_read(bev, buffer, EVBUFFER_LENGTH(bev->input));
printf("rd: %i\n",rd);

PM WWW   Вверх
REZiaMIX
Дата 13.8.2010, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @ 13.8.2010,  13:45)
Цитата(REZiaMIX @  13.8.2010,  11:31 Найти цитируемый пост)
я выделяю буффер размером size: 134549472, что многовато. Только тогда мне bufferevent_read возвращает нужное кол-во байт.

по моему - нет.
попробуйте так:
Код

char * buffer = new char[нужное кол-во байт];
int rd = bufferevent_read(bev, buffer, EVBUFFER_LENGTH(bev->input));
printf("rd: %i\n",rd);

А если размер буффера меньше EVBUFFER_LENGTH(bev->input). 
EVBUFFER_LENGTH(bev->input) в моем случае ~128мб, как функция bufferevent_read узнает размер памяти по указателю buffer?
А если прийдет больше чем [нужное кол-во байт]? будет переполнение.


--------------------
user posted image
PM MAIL   Вверх
MAKCim
Дата 14.8.2010, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



правильно так
Код

bufferevent_read(bev, <буфер>, <размер буфера>);

<буфер> - _твой_ буфер
<рфзмер буфера> - собственно, размер _твоего_ буфера


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




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


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

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