Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Проблемы с функцией WinAPI recv()


Автор: Gradov 6.5.2008, 13:03
Использую стандартный сокет 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;
...


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

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

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

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

Код

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


это не нужно, так как читаешь синхронно, функция завершится только в 2х случаях, когда все прочитано или когда соединение разорвано, тоесть если ф-я вернула не столько, сколько ты ей сказал прочитать - произошла ошибка.

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


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

Автор: GrayCardinal 6.5.2008, 19:08
Gradov, 
Завсегда пожалуйста.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)