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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с функцией WinAPI recv() 
:(
    Опции темы
Gradov
Дата 6.5.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Использую стандартный сокет TCP для получения URL из Интернет. Все вроде работает но вот функция recv() почему то очень долго читает ответ по 30 секунд и более. Даже если получаемая страничка всего навсего несколько байт.
Код работы recv() следующий:
Код

...
  s=socket(AF_INET, SOCK_STREAM, 0);
...
  result_size=1024*1024;
  result=(char*)malloc(result_size);
...
    int bufsize=result_size; 
    int bytesread=1;
    char *ptr=result;

    while ((bytesread>0) && (bufsize>0))
    {
      bytesread=recv (s, ptr, 1,0);
      if (bytesread>0)
      {
       ptr+=bytesread;
       bufsize-=bytesread;
      }
    }
    *ptr=0;
...


Я естественно понимаю что так быть не должно, и где-то наверное ошибка, но замучился уже ее искать... Помогите! 

Это сообщение отредактировал(а) Gradov - 6.5.2008, 16:38
PM MAIL   Вверх
GrayCardinal
Дата 6.5.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


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

Репутация: 3
Всего: 58



Gradov
У Вас там один ТОЧКА ноль. А должна быть запятая. Плюс третий аргумен - размер буфера приёма - один байт. Там должна быть не единица а bufsize;
Т.е.
Цитата

bytesread = recv (s, ptr, bufsize, 0);


Это сообщение отредактировал(а) GrayCardinal - 6.5.2008, 15:50


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 5
Всего: 154



по одному байту долго будет читать, нужно читать сразу всю страницу, правда сначала нужно узнать сколько нужно читать
Цитата(Gradov @  6.5.2008,  13:03 Найти цитируемый пост)

Код

      if (bytesread>0)
      {
       ptr+=bytesread;
       bufsize-=bytesread;
      }


это не нужно, так как читаешь синхронно, функция завершится только в 2х случаях, когда все прочитано или когда соединение разорвано, тоесть если ф-я вернула не столько, сколько ты ей сказал прочитать - произошла ошибка.
PM MAIL Skype GTalk   Вверх
Gradov
Дата 6.5.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(GrayCardinal @  6.5.2008,  15:49 Найти цитируемый пост)
Там должна быть не единица а bufsize;


Спасибо именно это решило мою проблему.  smile 

Это сообщение отредактировал(а) Gradov - 6.5.2008, 16:32
PM MAIL   Вверх
GrayCardinal
Дата 6.5.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


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

Репутация: 3
Всего: 58



Gradov
Завсегда пожалуйста.


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


 




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


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

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