Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 31.08.2019
Сообщений: 17

Пытаюсь создать не блокирующийся recv, не могу понять почему блокировка все рано происходит

16.10.2021, 22:17. Показов 8142. Ответов 12

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
string net_recv(SOCKET* client, size_t buffersize){
    int ready;
    fd_set read_s;
    FD_ZERO (&read_s);
    FD_SET (*client, &read_s);
// Если ошибка или сокет не готов к чтению то выхожу их функции
    if (SOCKET_ERROR == (ready = select (0, &read_s, NULL, NULL, NULL) ) ) return "";
    if(ready != 1) return "";
 
    char* buffer = new char[buffersize];
    int result = recv(*client, buffer, buffersize, 0);
    if(result == SOCKET_ERROR)
    {
        delete[] buffer;
        buffer = nullptr;
        return ""; 
    }
    if (result > 0){
        char* data = new char[result];
        memcpy(data, buffer, result);
        string str_data = string(data);
        delete[] data;
        delete[] buffer;
        data = nullptr;
        buffer = nullptr;
        return str_data;
    }
    return "";
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.10.2021, 22:17
Ответы с готовыми решениями:

Не могу понять почему не происходит присваивание
Что не так почему не происходит присваивание для a и b? int max, min, a, b; ...

Не могу понять почему происходит удаление записей
При выполнении изменений данных в выбранной записи, удаляются записи ниже перечисленные выбранной записи. Помогите кто чем может... ...

Не могу понять, почему не происходит выход из цикла
Здравствуйте, не могу понять почему не происходит выход из цикла Должен производится ввод неизвестного заранее количества элементов. Ввод...

12
0 / 0 / 0
Регистрация: 31.08.2019
Сообщений: 17
16.10.2021, 22:48  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
string net_recv(SOCKET* client, size_t buffersize){
    int ready;
    fd_set read_s; // Множество
    FD_ZERO (&read_s);
    FD_SET (*client, &read_s);
    if (SOCKET_ERROR == (ready = select (0, &read_s, NULL, NULL, NULL) ) ) return "";
    if(ready != 1) return "";
 
    char* buffer = new char[buffersize];
    int result = recv(*client, buffer, buffersize, 0);
    if(result == SOCKET_ERROR)
    {
        delete[] buffer;
        buffer = nullptr;
        return ""; 
    }
    if (result > 0){
        char* data = new char[result];
        memcpy(data, buffer, result);
        string str_data = string(data);
        delete[] data;
        delete[] buffer;
        data = nullptr;
        buffer = nullptr;
        return str_data;
    }
    return "";
}
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
17.10.2021, 08:39
Цитата Сообщение от Max_Shevyakov Посмотреть сообщение
Пытаюсь создать не блокирующийся recv, не могу понять почему блокировка все рано происходит
потому что select - блокирующий вызов.
а если у него не указан timeout, то он так же зависнет навсегда,
как и recv у блокирующего сокета,
пока не произойдёт событие для одного из сокетов, в нём указанных.
1
0 / 0 / 0
Регистрация: 31.08.2019
Сообщений: 17
17.10.2021, 14:53  [ТС]
Спасибо попробую, и еще я немного не понимаю какие дынне select возвращает, вот например я проверяю сокет на то что есть данные на чтение, и вот они появились что он мне вернет? Количество сокетов готовых к чтению? И что он возвращает если этих сокетов нет?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
17.10.2021, 17:59
https://docs.microsoft.com/en-... ck2-select
The select function returns the total number of socket handles that are ready and contained in the fd_set structures, zero if the time limit expired, or SOCKET_ERROR if an error occurred. If the return value is SOCKET_ERROR, WSAGetLastError can be used to retrieve a specific error code.
то есть вот это:
Цитата Сообщение от Max_Shevyakov Посмотреть сообщение
Количество сокетов готовых к чтению?
но не только для чтения.
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
17.10.2021, 22:24
Если у вас GUI, не используйте эти функции, потому что либо recv, либо select блокируют GUI.

Чтобы не блокировать GUI, вам придётся выбрать:

* запускать сеть в отдельном потоке — но тогда надобность в «неблокирующем» режиме отпадает.
* переключить сокет в асинхронный режим WSAAsyncSelect и обрабатывать оконные сообщения сокета.
* использовать WSARecv со структурой OVERLAPPED и перекрывающиеся операции ввода‐вывода + MsgWaitForMultipleObjectsEx.
1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
18.10.2021, 06:50
Цитата Сообщение от Замабувараев Посмотреть сообщение
запускать сеть в отдельном потоке — но тогда надобность в «неблокирующем» режиме отпадает.
почему отпадает? а если протокол не "запрос-ответ"?
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
18.10.2021, 08:58
Цитата Сообщение от GbaLog- Посмотреть сообщение
почему отпадает? а если протокол не "запрос-ответ"?
Я предлагаю в отдельном потоке запустить recv в цикле, это не потребует перевода в «неблокирующий» режим и не заблокирует GUI.
Не очень понятно, что значит «не запрос‐ответ». Поясните что вы имеете ввиду?
1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
18.10.2021, 09:14
Цитата Сообщение от Замабувараев Посмотреть сообщение
и не заблокирует GUI.
вопрос как в таком случае вызывать send?
ещё один поток создать? или вызвать в главном потоке? тогда тоже блокирующий вызов.
Цитата Сообщение от Замабувараев Посмотреть сообщение
Не очень понятно, что значит «не запрос‐ответ».
я предполагал классический сценарий клиент-сервера. клиент посылает запрос, на который приходит ответ от сервера.
существуют протоколы, которые действуют иным путём.
1
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
18.10.2021, 09:21
Цитата Сообщение от Max_Shevyakov Посмотреть сообщение
C++
7
if (SOCKET_ERROR == (ready = select (0, &read_s, NULL, NULL, NULL) ) ) return "";
select function
[in] timeout

The maximum time for select to wait, provided in the form of a TIMEVAL structure. Set the timeout parameter to null for blocking operations.
0
0 / 0 / 0
Регистрация: 31.08.2019
Сообщений: 17
18.10.2021, 18:05  [ТС]
У меня HTTP протокол, с отправкой HTML страниц проблем нет, я уже даже организовал всю систему связанную с этим, вроде бы все сделад нормально, но как я понимаю в момент когда браузер уже непосредственно читает HTML код который я ему отправил и встречает в нем например <img> то он отправляет мне запрос с тем что бы я ему отправил это изображение. Но это у меня не реализовано и все страницы открываются без изображений, CSS кода и других ресурсов которые нужно давать во время обработки. И тут я встрял в момент когда мне нужно отправлять и одновременно читать запросы на ресурсы мой recv просто встает в ожидании и страница естественно останавливает загрузку, т.к цикл отправки встает(я читаю строку HTML из файла и сразу отправляю и тут же жду ответа). В общем в чем то я ошибся, это мой первый опыт. Но залазить в многопоточность очень не хочется, я компилирую через mingw, а там с этим проблемы.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
18.10.2021, 19:07
Ваш браузёр делает запросы к вам синхронно или асинхронно?
1
0 / 0 / 0
Регистрация: 31.08.2019
Сообщений: 17
18.10.2021, 20:05  [ТС]
А вот это я не знаю, вроде как синхронно, я пробовал сначала передать весь HTML но ответа не последовало, а потом попробjвал передавать по одной строке и читать вроде бы он мне начал отвечать. Видимо синхронно, но я не знаю как на это влиять, я могу указать это в header?

Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int http_send_data(std::string path, SOCKET *sock){
   net_send(sock, http_form_header(100));
   string line;
   int lenght = 0;
   string data;
   ifstream file;
   file.open(path);
   if(!file.is_open()){
      http_send_data(pages["/404"], sock);
   }else{
        while (getline(file, line).eof()) {
            if(net_send(sock, line) == SEND_ERROR)
                break;
        }
    net_close_socket(sock);
   
   }
 
}
Вот тут я принимаю в функцию нужную запрашиваемую страницу и выдаю ее, но у меня не загружаются внешние ресурсы вроде <img>/<css link="..."> и т.д, я почитал и узнал что браузер отправляет запросы на эти ресурсы прямо в момент чтения HTML кода, я так понимаю мне нудно в цикле выставлять recv и синхронно с отправкой отбрабатывать запросы на внешние ресурсы, но как видите я опять столкнулся с проблемой, recv() просто останавливается и кстати select() все равно работать по нормальному не стал(работает через раз), видимо придется делать многопоточность.
Не обращайте внимания на немного другое название функций winsock я сделал небольшую оболочку что бы было попроще.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2021, 20:05
Помогаю со студенческими работами здесь

Пытаюсь создать функцию удаления строки. Не могу понять в чём ошибка
function connect() { $connect = mysql_connect('localhost', 'frank', 'delgado') or die(mysql_error()); } function...

Анализ сортировок массивов. Не могу понять, почему происходит ошибка
Собственно, задание было таким: Произвести анализ сортировок массивов в соответствии с сортировками прямым выбором и Шелла.. Для чего...

Не могу понять почему происходит разный вывод в консоль и файл
Помогите понять почему в консоль выводит, как надо - вначале массив а потом его адреса, а в файл вначале адреса, потом массив .вот код : ...

Пытаюсь понять комбинаторику.Не могу понять какую формулу использовать
Добрый день. Уже второй день бьюсь над комбинаторикой. Проблема стоит в том, что не могу понять, какую формулу нужно...

пытаюсь подключить по локальной сети вроде всё подключил но не могу создать группу
привет всем у меня такая проблема у меня 2 ноута с виндой7 пытаюсь подключить по локальной сети вроде всё подключил но не могу создать...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru