Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
AntiAlianKiller
2 / 2 / 0
Регистрация: 08.05.2013
Сообщений: 14
#1

Как избавиться от остановки программы из-за функции recv()? - C++

02.08.2013, 01:59. Просмотров 534. Ответов 2
Метки нет (Все метки)

Я пишу чат на WinSock. Суть его проста - существует цикл, в котором идет такая последовательность действий:
1. Если нажат Enter, то отправляем данные send()
2. Прием данных recv()
3. Анализирование и вывод принятых данных

Все работает правильно, данные анализируются и отправляются без ошибок... Но есть одна проблема:
Как только цикл доходит до функции приема данных recv(), то он останавливается: он не желает продолжать ход программы, пока не будут приняты хоть какие-то данные.
По моей задумке, даже если данные с помощью recv() приняты не будут, ход программы не будет остановлен (Иначе получается, что я не смогу отправить данные, пока их не прийму.)

Так как же исправить это? Была мысль выполнять функцию в отдельном потоке, а принятые данные выводить в качестве глоб. переменной, но тогда прием работать не будет (функции recv() нужны данные о сокете, который объявляется в другом потоке, а перенести его объявление сюда, это значит, что и весь основной код надо перенести сюда, а это все равно, что ничего не менять).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2013, 01:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как избавиться от остановки программы из-за функции recv()? (C++):

Как сделать получение текста из консоли, без остановки программы? - C++
Вообщем суть вопроса в заголовке. Допустим, у меня есть цикл: char str; while(true) { gets(str); //прочие действия } Мне...

Защита программы от остановки процесса - C++
Есть лаунчер для игрового сервера который отслеживает у пользователя читерский софт и разумеется банит. Но нашлись умники который просто...

Обработка функции recv структуры SOCKET - C++
Прошу помощи как обработать полученную информацию из функции recv структуры SOCKET. к примеру: char buf="GooD";char mass; retVal...

Как избавиться от пустых строк в коде программы? - C#
Помогите решить задачу с помощью char. Вводится код программы содержащий комментарии.Нужно удалить комментарии и вывести код программы...

Как избавиться от goto без вреда для программы? - C#
Как избавиться от goto, сохранив при этом функционал программы? Чтобы программа работала точно так же как и с goto? namespace...

Как найти и избавиться от остатков загруженных на С файлов программы - Windows 7
Мучаюсь с установкой Poser Pro деинсталирую, сново устанавливаю и замечаю побочный эффект - емкость диска С постоянно уменьшается, даже...

2
Fyret
200 / 186 / 20
Регистрация: 30.07.2013
Сообщений: 392
02.08.2013, 02:16 #2
Используйте неблокирующий сокет:

C++
1
2
u_long mode = 1;
ioctlsocket( socket, FIONBIO, &mode );
1
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
02.08.2013, 04:48 #3
или использовать WSARecv

Добавлено через 26 секунд
Или запускать recv в отдельном потоке

Добавлено через 32 минуты
Цитата Сообщение от AntiAlianKiller Посмотреть сообщение
функции recv() нужны данные о сокете, который объявляется в другом потоке
Сокет можно создать в потоке который вызывает recv, также можно передать потоку сокет через параметры
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2013, 04:48
Привет! Вот еще темы с ответами:

Определите, на каких маршрутах можно добраться от остановки X до остановки Y - Prolog
Я новичок в прологе. Пытаюсь что-то сделать, но ничего не компилится) Скоро сдавать. Задание: Создайте базу данных городского...

Поток останавливается на функции recv - C++
Создаю поток. в нем делаю сокет. и все бы ничего - да вот на функции recv все останавливается... просто стоит - как будто ждет...

Защита программы от остановки процесса - C++
Есть лаунчер для игрового сервера который отслеживает у пользователя читерский софт и разумеется банит. Но нашлись умники который просто...

Изменить тайм-аут функции recv() - C++
Всем привет! Как можно установить свой тайм-аут на функции recv()? Хочу ждать данные 10 секунд и если они не пришли за этот период -...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru