![]() |
|
Модераторы: feodorv |
![]()
|
|
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Тема породилась от http://forum.vingrad.ru/topic-142286.html
На данный момент сервер реализован по принципу
источник http://www.codersource.net/winsock_tutoria...lect_model.html Извините что на английском, просто нашел в интернете подходящее описание... Опишу поконкретней на русском, хотя различия моей реализации немного отличаются принцип один и тот же. В потоке создается non blocking сокет, и циклом начинаю обрабатывать его сообщения, т.е. получаю какие события есть, читаю данные из листа сокетов и выдаю события. В цикле также пытаюсь сделать accept чтобы получить событие OnConnect и присойденить клиента к серверу. Проблема в том что поток сильно грузит процессор. Есть ли что нибудь неправильное в реализации или в организации чтения данных? Заранее благодарю |
|||
|
||||
| seacat79 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 27.2.2007 Где: Украина, Одесса Репутация: нет Всего: 1 |
Почему-бы не сделать на каждый сокет свой поток, тогда при вызове listen() данный поток будет засыпать до получения сообщения, после чего деалешь accept() и обрабатываешь информацию, после чего снова accept и т.д. |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Не пойдет потому что
1) Это более чем 1000 потоков если не больше (т.к. к серверу может одновременно подсойдениться около 1000 пользователей). Сейчас они распределены на несколько потоков..К примеру 10, и каждый поток обрабатывает около 100 connection -ов. Так что этот вариант не пойдет. 2) На каждый поток подключение к базе данных и нехилые проблемы с синхронизацией. Короче это не вариант |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 1 Всего: 158 |
судя по-всему, просто неверно реализована работа с неблокирующими сокетами. в сети примеров - куча. вобщем, select тебе в помощь
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Я привел пример...у меня реализовано почти также... Вообще то select не особо поможет...мой select будет спать пока я не получу сообщение..а кто тогда будет делать accept? Добавлено @ 15:42
В каком смысле?? я же описал как я сделал. Что в этом неправильно? |
|||
|
||||
| dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 1 Всего: 158 |
событие чтения возникает на listen-сокете, когда приходит новое соединение. после получения этого сообщения ты и должен делать accept.
Добавлено @ 16:37 кстати, пример твой сильно "детский". тебе посурьезнее нужен. |
||||
|
|||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
А вот это я кажется упустил из MSDN -а...совсем другое дело Большое спасибо +1 Добавлено @ 16:46
Знаю...Я не оттуда копировал..просто принцип работы похож...в смысле обработка данных...а то нормального примера я пока в интернете не видел с нормальной реализацией событий...пришлось самому писать.. Это сообщение отредактировал(а) azesmcar - 22.3.2007, 16:47 |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |