![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| fiss |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 10.1.2009 Где: nov.ru Репутация: нет Всего: нет |
Здравствуйте, начал писать многопоточный сервер.
Вот код:
sockets.h - хеадер от класса для работы с сокетами. Необходимо чтобы сообщения со всех подключенных клиентов отображались в консоли на сервере. Подключаю первый клиент (простая программа которая отправляет данные, введенные с клавиатуры), пишу сообщение, на сервере оно выводится. Подключаю второй клиент, посылаю сообщение, оно также выводится на экран. Затем пробую написать что-нибудь с первого клиента, но сообщения уже не доходят и не отображаются на сервере. В чем ошибка? p.s. Код функций работы с сокетами:
|
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
у тебя в синхронном режиме recv после приема всех сообщений на одном сокете будет засыпать, если клиент не разорвет соединение с сервером, т.е. по достижению N открытых сокетов, сервер просто ни кто не будет обрабатывать - все потоки спят
но это не критично, критично то, что все потоки после обработки своего сокета закрываются, а новые - не создаются, следовательно, сервер становится недееспособным, отсюда и проблема нужно в потоках сменить организацию приема клиентов в цикл и перед чтением сообщения с клиента, проверять буфер на пустоту, т.е. добавлять еще один recv с флагом PEEK Это сообщение отредактировал(а) GremlinProg - 26.1.2009, 22:40 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Твой класс Socket не расчитан на многопоточную работу - метод Accept переписывает переменную acceptSocket, которая получается единственной на ВСЕ нити сервера. Соотвественно работать будет только последняя нить, которая сделала Accept
|
|||
|
||||
| fiss |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 10.1.2009 Где: nov.ru Репутация: нет Всего: нет |
Спасибо всем! Заработало, дело было в acceptSocket (смотреть пост xvr).
Вот работающий код:
И код функций:
|
||||
|
|||||
| fiss |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 10.1.2009 Где: nov.ru Репутация: нет Всего: нет |
p.s. извиняюсь за то что создал еще один пост (мне его просто не удалить), вот работающий без багов код (в предыдущем посте сервер обрубался по истечению некоторого времени).
Это сообщение отредактировал(а) fiss - 27.1.2009, 20:48 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Я бы разделил класс Socket на 2 - слушающий сервер и собственно рабочий экземпляр. accept должен делать второй класс в своем конструкторе
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
fiss, поставь N = 2 и пошли серверу с 3-х разных к нему соединений по одному сообщению
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| fiss |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 10.1.2009 Где: nov.ru Репутация: нет Всего: нет |
Дак это понятно. третий не примется. Это же не законченная версия сервера, меня просто интересовала проблема потоков и accept Это сообщение отредактировал(а) fiss - 28.1.2009, 15:19 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
я бы не юзал ооп там где это не надо
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |