Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2013, 04:17   #1
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию Однопоточный сервер

Здравствуйте. Допустим, имеется:
Код:
//...
unsigned int sockets[16];
int index = 0;
struct timeval tm;
fd_set input;
while(result != INVALID_RESULT)
{
     FD_ZERO(&input);
     FD_SET(server_socket, &input);
     tm.tv_sec = delay; // delay = [0...n ];
     tm.tv_usec = 0;

     result = select(server_socket+1, &input, NULL, NULL, &tm)
     switch(result)
     {
         case -1: // ...
         case 0 : // ...

         default: {
            if(IsExistNewConnection() == true)
            sockets[index++] = accept(server_socket, NULL, NULL);
            //...
            /* Здесь выполняется все необходимое по приему сообщений
             от подключенных сокетов в sockets[16], отключение клиентов 
             и подключение новых. Все работает отлично.
            */
     }
}
Сервер должен рассылать клиентам(sockets[16]) сообщения, но методы fgets(); и cin.getline(); прерывают выполнение потока, и поэтому прием сообщений от клиентов будет прерван операцией ввода на сервере. Пришлось сделать операцию ввода в отдельном потоке, куда передается в качестве параметра массив sockets[16], и этим сокетам отправляются введенные сообщения.
Вопрос: возможно ли организовать ввод и отправку сообщений в том же потоке, где производится прием сообщений от клиентов?
halcyon вне форума Ответить с цитированием
Старый 13.08.2013, 04:27   #2
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

возможно, ведь у тебя таймер весит на select, только учти, что голод не тётка.
Nuklon вне форума Ответить с цитированием
Старый 13.08.2013, 09:39   #3
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

к сожалению, не совсем понял вашу мысль
halcyon вне форума Ответить с цитированием
Старый 13.08.2013, 12:39   #4
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Наверное он имеет в виду что пока осуществляется ввод, таймеры достигают лимита, отсюда и прерываение связи.
Можно не использовать постоянное соединение а обрывать сразу после обмена данными.
do not use your brain

Последний раз редактировалось Кащей; 13.08.2013 в 12:41.
Кащей вне форума Ответить с цитированием
Старый 13.08.2013, 13:23   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от halcyon Посмотреть сообщение
Вопрос: возможно ли организовать ввод и отправку сообщений в том же потоке, где производится прием сообщений от клиентов?
Смысл в том, что бы не использовать ничего "залипающего".
А использовать кучку мелких, и по возможности никак не связанных между собой задачек, которые выполняются достаточно быстро.

Тогда возникнет иллюзия, что все задачи выполняются параллельно.

Например, ввод на сервере разбивается на подзадачки:

Начало: Вечный цикл главного потока:

Подзадачка 1. была ли нажата клавиша? Да - поместить в буффер вводимых данных ещё один символ.
Нет - ничего не делаем. Выходим из процедуры.

Подзадачка 2. В буффере входных данных присутствует код клавиши ентер? Да - включаем флаг о завершении ввода.
Нет - ничего не делаем.

Подзадачка 3. Флаг о завершении ввода включен? Да - сбрасываем этот флаг, и что-то делаем с полученными данными.
Нет - ничего не делаем.

Подзадачка 4. Любые другие действия.

Конец: Повторить вечный цикл главного потока.

Вместо одной залипающей функции ввода получаем три коротеньких, простеньких и изолированных друг от дружки. Которые не залипают.

Их можно вызывать в любом порядке следования.
Допустим, можно сначала вызвать задачку 3, потом задачку 2, потом задачку 1. От этого бизнес-логика работы ввода никак не изменится.

Этот фактор позволяет легко контролировать сложность происходящего.
И будет работать прекрасно до тех пор, пока не нарушится инкапсуляция задач.

То есть, пока ты можешь выстраивать функции-задачи в любой последовательности относительно друг друга - значит все хорошо.

Такая "псевдо параллельность" не требует механики синхронизации, или чего то там подобного. Поэтому, она работает быстро.

Если же вынести в отдельный поток ввод, только потому, что он "залипает" - это на ровном месте просаживать производительность, и усложнять проект.

Ради только этого я бы не стал использовать многопоточность.
_Bers вне форума Ответить с цитированием
Старый 14.08.2013, 11:33   #6
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

_Bers, спасибо за содержательный и развернутый ответ, он оказался полезным. Плюсую.
halcyon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сервер Cas01 HTML и CSS 12 29.12.2014 00:08
Com - сервер и C# m9yt C# (си шарп) 3 22.06.2012 02:26
Сервер atenon Свободное общение 4 14.01.2011 07:55
CS Сервер DRAP707 Свободное общение 0 15.04.2010 15:43
Сервер Syltan Свободное общение 5 11.10.2009 23:37