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

Код не дожидается своей функции. Необходимо строго остановить работу кода до появления функции

25.06.2018, 15:51. Показов 887. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно пару слов о коде. Организован бесконечный цикл ожидания приёма 1 с клиента серверу и посылка данных от сервера клиенту при получении 1.
Сервер:
C++
1
2
3
4
5
6
7
8
9
while (TRUE)
{
SocketRecv(s,check,1); /где с - сокет, чек - буфера приёма, 1 - 1 байт, размер буфера
if (check[0] = 1) //проверка - если получаем 1-ку выполняем код ниже
{
//Делать кучу вещей - отсылать данные и т.д.
check[0] = 0; //обнуляем чек чтобы программа "зависла" на функции SocketRecv и ждала своего часа
}
}
В теории - программа - сервер ждёт 1 от клиента и при получении 1-ки и посылает необходимые данные.
Реальность - это работает если с SocketRecv работать постоянно, т.е. в пределах 10 секунд, дальше почему-то программа отказывается ждать появления 1ки и всё равно (!) как ни странно пытается выполнить следующий блок
C++
1
2
3
4
5
if (check[0] = 1)
{
//Делать кучу вещей - отсылать данные и т.д.
check[0] = 0; //обнуляем чек чтобы программа "зависла" на функции SocketRecv и ждала своего часа
}
Хотя переменная check обнулена.
Может кто подскажет как правильно заставить программу строго ждать выполнение процедуры? Или подскажет иной способ реализации моих задач?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.06.2018, 15:51
Ответы с готовыми решениями:

Возврат кода ошибки из своей функции, возможно ли
Доброго времени суток. Пишу функцию, которая возвращает строку. Как быть с кодом возврата, если возникнет ошибка. Я могу код ошибки...

Остановить работу какого-либо кода по нажатию кнопки
Здравствуйте Уважаемые! Подскажите, как быть в такой ситуации: По нажатию кнопки выполняется некий код, после этого программа ждет...

Как остановить цикл в функции, в другой функции
Пытался сделать так, программа зависает и вторая функция не работает def script(event): i = 100 while i > 3 : ...

8
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
26.06.2018, 07:58
kosmonavt40rus, какая библиотека? Может там тайм-аут приема задан просто?
0
1 / 1 / 0
Регистрация: 22.12.2015
Сообщений: 26
26.06.2018, 08:47  [ТС]
Я работаю с камнем Vortex86. Для него разработчики написали библиотеку для работы с сетью:
http://www.dmp.com.tw/tech/dmp-lib/dsock/

Конкретно я работаю с библиотекой dsock.lib и заг. файл dsock.h, где функция Recv выглядит следующим образом:

int SocketRecv (SOCKET s,BYTE *pby,int nLen);

Никаких временных рамок здесь я не вижу, но в итоге получается что код ждёт 10 секунд и если не получает свои данные, то просто продолжает выполнение кода ниже. Вот и не знаю как мне "застакать" код на этом месте. Не понятен мне и тот факт, что
C++
1
2
3
4
5
 if (check[0] = 1)
{
//Делать кучу вещей - отсылать данные и т.д.
check[0] = 0; //обнуляем чек чтобы программа "зависла" на функции SocketRecv и ждала своего часа
}
Этот кусок кода всё же выполняется, хотя check[0]=0 он априори не должен выполняться.
Может есть какая-то идея как по другому организовать бесконечный цикл или использовать какие-то функции из языка C++ которые позволят мне "жестко" остановить продолжение выполнения кода? Я просто программирую 3 месяца и могу чего-то не знать, даже может быть очевидного
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
26.06.2018, 12:25
1) Проверять, что возвращает SocketRecv. Не зря же он возвращает int.
2) Читать документацию по своему набору команд. У обычных сокетов то же нет в аргументах recv таймаута, оно задаётся другими функциями.
0
1 / 1 / 0
Регистрация: 22.12.2015
Сообщений: 26
26.06.2018, 14:33  [ТС]
Назначение SocketRecv() - Receive data from a socket
При чём есть отдельная функция - SocketRecv2() - Non-blocking function of SocketRecv(). Т.е. тоже самое, только не блокирующая функция.

SocketRecv() при ошибке возвращает -1.
Но я пока не особо понимаю как я могу использовать этот факт.

Добавлено через 53 минуты
Пробую идти другим путём:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
while (TRUE)
        {
            receive:
        int fun;
        fun = SocketRecv(s,check,1);
        if (check[0] = 1)
        { куча кода}
        if (fun = -1)
        {
            goto receive;
        }
        
}
Тоже не работает.
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
27.06.2018, 01:14
Цитата Сообщение от kosmonavt40rus Посмотреть сообщение
check[0] = 1
check[0] = 1 и check[0] == 1 - разные вещи.
1
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
27.06.2018, 06:44
Цитата Сообщение от kosmonavt40rus Посмотреть сообщение
Я работаю с камнем Vortex86. Для него разработчики написали библиотеку для работы с сетью:
http://www.dmp.com.tw/tech/dmp-lib/dsock/
ТЗ строго под ДОС?
Эта библиотека уже лет 10 не поддерживается, а исходники закрыты.
0
1 / 1 / 0
Регистрация: 22.12.2015
Сообщений: 26
27.06.2018, 10:23  [ТС]
lArtl, согласен я позже увидел ошибку, спасибо.

Однако экспериментальным путём было выяснено что в случае не получения 1ки он возвращает 0, и код трансформировался в следующее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while (TRUE)
        {
            receive:
            check[0] = 0;
            printf("WHILE TRUE\n");
        fun = SocketRecv(s,check,1);
        printf("fun: %d\n", fun);
        if (fun == 0)
        {
            printf("fun is 0!\n");
            goto receive;
        }
        if (check[0] = 1)
        { куча кода
                check[0] = 0;
                }
Однако если просто оставить работать программу,в случае возврата к точке receive, я отсылаю 1-ку, но он никак на неё не реагирует. Это если я выжидаю паузу и потом пробую отправлять данные.
А если же просто оставить работу программу, то проходит буквально 2 итерации когда программа прыгает к receive, затем включается бесконечный цикл и он выводит следующее:
C++
1
2
3
fun: 0
fun is 0!
WHILE TRUE
Хотя опять же в теории он должен хотя бы бесконечно ждать выполнения функции SocketRecv, а не уходить в бесконечный цикл.

gng, нет там всё работает. Конкретно я работаю с CPC109
0
Заблокирован
29.06.2018, 20:12
Цитата Сообщение от kosmonavt40rus Посмотреть сообщение
Организован бесконечный цикл
Что за хрень, а как же highload?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.06.2018, 20:12
Помогаю со студенческими работами здесь

Работа функции cin.get(): не дожидается ввода символа в конце программы
Доброго времени суток, столкнулся с таким странным поведением cin.get(), после окончания ввода списка (ответ n) вместо того, что бы в конце...

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

Использование функции в своей программе из своей dll
Среда разработки Visual Studio 2008 Язык C++ Написал dll как в примере на сайте...

Работа функции qsort - объяснить работу функции
#include<iostream> #include<cstdlib> int mysort(const void *arg1, const void *arg2); int main() { const short ARR_SIZE=5; int...

Строгая монотонность строго выпуклой функции
Верно ли, что строго выпуклая функция - строго монотонна. Графически данное утверждение видется верным, но точного доказательства не...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru