Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
8 / 8 / 3
Регистрация: 01.03.2013
Сообщений: 85

с++ recv сильно большая задержка после последнего полученного блока информации

05.03.2013, 12:41. Показов 1654. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.

Столкнулся с такой проблемой при получении ответа сервера:
C++
1
2
3
4
5
6
7
8
9
10
11
12
char *tmpStr = NULL;
do {
    iResult = recv(ConnectSocket, recvbuf, recvbuflen-1, 0);
    if(iResult > 0){
        recvbuf[iResult] = '\0';
        tmpStr = new char[strlen(*response)+iResult+1];
        strcpy(tmpStr, *response);
        *response = new char[strlen(*response)+iResult+1];
        strcpy(*response, tmpStr);
        strcat(*response, recvbuf);
    }
} while (iResult > 0);
В этом коде я получаю ответ сервера и заношу его в динамический массив char *response. Возможно, это очень неграмотно реализовано, поэтому буду рад вашим советам и по этому поводу, но тревожит меня больше другое. Весь этот код удовлетворяет моим потребностям, только после получения последнего блока информации возникает довольно продолжительная задержка. Т.е. (как я понимаю) подвисает recv() при последнем вызове, когда recv() выдает 0.

Из-за чего это может происходить и как это можно исправить?

Всем заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2013, 12:41
Ответы с готовыми решениями:

Вывод информации из БД при входе на сайт и вывод одного последнего добавленного блока
Здравствуйте! Немного столкнулся с проблемой: Есть небольшой сайт, пробный, есть задание: 1. Запрограммировать форму для отправки...

Проблема с оперативной памятью. Большая задержка?
Доброго вечера форумчане! Проясните пожалуйста одну вещь. Имеется память - G.Skill DDR3-1600 8192MB PC3-12800 (F3-1600C11S-8GNT). В...

CoIDE большая задержка перед отладкой приложения
Добрый день! Использую Кокос версии 1.7.7. IDE очень долго входит в режим отладки от 30 сек до 1 мин. Отлаживаю STM32 через ST-Link v2 или...

7
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
05.03.2013, 15:41
Цитата Сообщение от igorbelykh Посмотреть сообщение
Из-за чего это может происходить и как это можно исправить?
Вероятнее всего сервер не сразу закрывает сокет.
Методы лечения могут быть разные, например можно ждать ответа в течении n секунд и если ничего не произошло, то закрывать сокет самому.
1
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
06.03.2013, 09:44
может сервер сокет вообще не закрывает и его прибивает система через ооочень большое время
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
06.03.2013, 10:37
Цитата Сообщение от vxg Посмотреть сообщение
может сервер сокет вообще не закрывает и его прибивает система через ооочень большое время
Если его прибила система сервера, то клиенту без разницы(придут те же пакеты, что и при close()). Если же Вы о системе клиента,то recv() вернет не 0 как пишет ТС, а что-то около ETIMEDOUT (не знаю как на Виндоуз эта ошибка называется).
Ооочень Большое Время - это АФАИР 2 часа по умолчанию (без учета возможных происков со стороны промежуточных хостов).
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
06.03.2013, 14:35
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
а что-то около ETIMEDOUT
если судить по
----
"If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError."
----
то recv вернет 0. мб ETIMEDOUT пойдет в ошибку библиотеки. не знаю.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
06.03.2013, 15:29
Цитата Сообщение от vxg Посмотреть сообщение
если судить по
Пардоньте, но "gracefully closed" всегда подразумевало аккуратное закрытие соединения пиром через close() (т.е. нормальный переход из ESTABLISHED в CLOSED), а не аварийное завершение соединения. Впрочем, может у MS язык не как у всех...
Цитата Сообщение от vxg Посмотреть сообщение
то recv вернет 0. мб ETIMEDOUT пойдет в ошибку библиотеки. не знаю.
Вряд ли, это уже маразм какой-то.
Вроде винда вполне себе умеет SO_RCVTIMEO (хоть и с не стандартной семантикой) - поведение (в плане возвращаемого значения) должно быть аналогично.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
06.03.2013, 16:28
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
gracefully closed
смотреть надо на "Otherwise". и мы видим, что никакого результата кроме 0, SOCKET_ERROR и размера принятого пакета эта функция не возвращает. хотя я конечно не пробовал издеваться над ней. таймаут система зафиксирует и скорее всего покажет WSAETIMEDOUT который можно получить через WSAGetLastError
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
06.03.2013, 17:00
Вы мое "recv() вернет ETIMETDOUT" поняли буквально???
Имелось введу, что результат будет не 0 как у ТС, а -1 (SOCKET_ERROR в виндоуз) и errno (WSAGetLastError у Вас) будет ETIMEDOUT.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2013, 17:00
Помогаю со студенческими работами здесь

Большая временная задержка при загрузке win7
Последние 4 дня мой комп грузится в замедленном режиме. 1. При включение компа происходит тестирование биоса (как обычно). 2. Дальше...

Почему при ответе на пакет ( recv / send ) скорость очень сильно падает ?
Добрый день. Объясните, пожалуйста, в чем дело ? Драйвер на основе примера mux из WinDDK передает, и принимает пакеты на большой...

Модем Archer T2U NANO большая задержка пинга
Добрый вечер, приобрел себе новый ПК, в связи с чем появился модем Archer T2U NANO. Все дрова из коробки встали, в сеть доступ есть, пишу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru