7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189

Плохо работает recv

08.05.2019, 17:34. Показов 3213. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не кто не сталкивался с проблемой. recv читает первый раз хорошо все данные приходят как надо, на второй раз он читает в буфер 0, 0 читает столько сколько указано в 3 параметре и это длится бесконечно, то есть сокет не блокируется, при этом "Сервер" не чего не отправляет стоит на бреакпоинте.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.05.2019, 17:34
Ответы с готовыми решениями:

Интернет работает, но Chrome и IE не открывают сайты. Firefox работает, но плохо
Добрый день! У меня два компьютера получают интернет от одного роутера. На одном компьютере всё нормально, на втором началась такая...

Всего одна из страниц сайта плохо работает в IE и Мозилле (абра-кадабра).В Опере все работает.
Привет всем. Сделал небольшой сайтик на HTML и немножко СSS там присутствует. Это мой первый сайт. Состоит из десяти страничек....

Не работает или совсем плохо работает интернет
Здравствуйте! Что-то третий день уже на винде не работает интернет. Так иногда, если долго обновлять страницу, что-то откроется. А вот с...

33
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
15.05.2019, 14:20
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Sierra26 Посмотреть сообщение
а что будет если буфер recv переполнится?
Неблокирующий по-моему просто ничего не отправит. Проверяй результат recv, чтто не меньше чем ты отправил

Добавлено через 2 минуты
Цитата Сообщение от Sierra26 Посмотреть сообщение
И как узнать размер буффера сокета?
setsockopt/getsockopt - SO_RCVBUFSIZ, SO_SNDBUFSIZ

Добавлено через 15 минут
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Проверяй результат recv, чтто не меньше чем ты отправил
Результат send
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
15.05.2019, 17:41  [ТС]
Сделал отдельно клиента и сервера ,все работает. Ничего не понимаю
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
15.05.2019, 17:57  [ТС]
Хотя нет, Ломается. oleg-m1973, если не сложно не могли бы попробовать у себя. У меня даже на локальном компьютере, если стоит сервер и клиент, то не так работает.
Вложения
Тип файла: rar TestClientServer.rar (9.6 Кб, 3 просмотров)
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
15.05.2019, 18:23
Sierra26, попробую еще раз повторить: внимательно разберись в размером передаваемой структуры - размер в цикле у тебя вычитается и в итоге у тебя в сенде просто идет 0.
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
15.05.2019, 19:16  [ТС]
Вованя, где он вычитается. Ничего не понял. Можете показать участок кода
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
15.05.2019, 20:27
Sierra26, в функции Send()
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
15.05.2019, 21:32
Цитата Сообщение от Sierra26 Посмотреть сообщение
У меня даже на локальном компьютере, если стоит сервер и клиент, то не так работает.
Я ж тебе вроде сказал - напиши простой сервер, на один коннект, а не то что у тебя там. Потом напиши клиента, чтоб работал. Потом усложняй сервер.
1
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
16.05.2019, 11:26  [ТС]
Проблема все таки в клиенте. И у меня возник вопрос? В каких случаях разблокируется функция recv. Мое мнение было, что когда придут данные >= указанных в 3 параметре функции recv, но оно оказалась ошибочным!
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.05.2019, 11:27
Цитата Сообщение от Sierra26 Посмотреть сообщение
В каких случаях разблокируется функция recv. Мое мнение было, что когда придут данные >= указанных в 3 параметре функции recv, но оно оказалась ошибочным!
Или когда сервер разорвёт коннект, должен прийти ноль.
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
16.05.2019, 11:29  [ТС]
вот что вычитал: "Дело в том, что recv гарантирует лишь то,
что в случае успеха будет прочитано от 1 до sizeof(buffer) байт.
В данном случае размер буфера для recv - 4 байта, но прочесть она
может за один вызов и три байта, и два, и один. Так что начать нужно с этого."

Кстати говоря, это вообще наитипичнейшая ошибка всех, кто учит работу в сетях."

Ссылка на форум Функция recv не разблокируется после отправки сообщения в канал
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.05.2019, 11:38
Цитата Сообщение от Sierra26 Посмотреть сообщение
Кстати говоря, это вообще наитипичнейшая ошибка всех, кто учит работу в сетях."
Ошибка - использовать блокирующий recv. Нужно делать так
В цикле:

делаешь select/poll/WSaPoll на таймаут ~100ms, если данных нет - снова
если данные пришли, запрашиваешь размер ::ioctlsocket(sock, FIONREAD, &dwRead)
если dwRead == 0 , то сервер разорвал коннект, можно закрывать сокет
делаешь n = recv(....., dwRead), усли n < dwRead - коннект разорван...
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
16.05.2019, 11:50  [ТС]
да проблема оказалась в том ,что recv гарантирует лишь то, что в случае успеха будет прочитано от 1 до sizeof(buffer) байт. Решил проблему написание вот такой функции. Может быть кому-нибудь пригодится:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool Recv(IN SOCKET s, char* buf, int len, int flags)
{
    int nSumByte = 0;
    int nByte = 0;
    do
    {
        int nByte = recv(s, &buf[nSumByte], len - nSumByte, 0);
        if(nByte <= 0)
            return false;
        nSumByte += nByte;
        if(nSumByte == len)
            return true;
        else
            int k = 6;
    }while(true);
 
}
Всем спасибо!
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
16.05.2019, 12:50
Цитата Сообщение от Sierra26 Посмотреть сообщение
C++
1
2
else
* * * * * * int k = 6;
что это?
Цитата Сообщение от Sierra26 Посмотреть сообщение
int flags
не используется.
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
16.05.2019, 13:00  [ТС]
else
* * * * * * int k = 6;
Это для отладки.

int nByte = recv(s, &buf[nSumByte], len - nSumByte, flags);

flags сюда надо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.05.2019, 13:00

Перехват API winsock32.recv - под отладчиком работает 100%, без отладчика - 50%
Добрый день, уважаемые Киберчане. Прошу Вашей поддрежки. Описание проблемы. Вызов функции CreateFileA, для записи буфера...

Не работает или плохо работает озу !
с недавнего времени стали такие проблемы ! - часто синий экран смерти пишет &quot;memory management&quot; - браузер Firefox...

Плохо работает Wi Fi
http://www.microprice.ru/product/a45M3o543043870634d456Ce Очень плохо видит сеть, другие компьютеры видят нормально. Что можно сделать?

Плохо работает роутер
Здравствуйте, я долго искал, куда можно обратиться по данному вопросу, попробую сюда) В общем купил роутер Wi-fi TRENDNET 652BRU, года...

Плохо работает include!
Здраствуйте, заранее спасибо кто поможет=))) Ситуация такая папка сайта www - (в ней страници , папка с программой, и другие...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru