Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование сокетов, получение событий, Есть ли ошибки в принципе работы 
V
    Опции темы
azesmcar
Дата 22.3.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Тема породилась от http://forum.vingrad.ru/topic-142286.html

На данный момент сервер реализован по принципу
Цитата

  The base idea is follows. As for any server socket, the socket needs to be created, bind and then it should start listening at a specified port. Then the socket must be made Non-blocking by calling ioctlsocket. After that, check for any new connections, read or write using select function. 

  When the socket has to be checked for readability add the socket to the readfds set and wait for the function select to complete. When the call to select is complete, the socket is to be checked if it is still part of readfds set. If that is true, then the socket has some data to read. Any one of the three parameters must contain a socket handle while usage.

источник http://www.codersource.net/winsock_tutoria...lect_model.html

Извините что на английском, просто нашел в интернете подходящее описание...
Опишу поконкретней на русском, хотя различия моей реализации немного отличаются принцип один и тот же.
В потоке создается non blocking сокет, и циклом начинаю обрабатывать его сообщения, т.е. получаю какие события есть, читаю данные из листа сокетов и выдаю события. В цикле также пытаюсь сделать accept чтобы получить событие OnConnect и присойденить клиента к серверу.
Проблема в том что поток сильно грузит процессор. Есть ли что нибудь неправильное в реализации или в организации чтения данных?

Заранее благодарю
PM   Вверх
seacat79
Дата 22.3.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 27.2.2007
Где: Украина, Одесса

Репутация: нет
Всего: 1



Цитата(azesmcar @  22.3.2007,  11:28 Найти цитируемый пост)
В потоке создается non blocking сокет, и циклом начинаю обрабатывать его сообщения, т.е. получаю какие события есть, читаю данные из листа сокетов и выдаю события. В цикле также пытаюсь сделать accept чтобы получить событие OnConnect и присойденить клиента к серверу.


Почему-бы не сделать на каждый сокет свой поток, тогда
при вызове listen() данный поток будет засыпать до получения сообщения,
после чего деалешь accept() и обрабатываешь информацию, после чего снова accept и т.д.
PM MAIL ICQ   Вверх
azesmcar
Дата 22.3.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Не пойдет потому что
1) Это более чем 1000 потоков если не больше (т.к. к серверу может одновременно подсойдениться около 1000 пользователей). Сейчас они распределены на несколько потоков..К примеру 10, и каждый поток обрабатывает около 100 connection -ов. Так что этот вариант не пойдет.

2) На каждый поток подключение к базе данных и нехилые проблемы с синхронизацией.

Короче это не вариант
PM   Вверх
dumb
Дата 22.3.2007, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 1
Всего: 158



судя по-всему, просто неверно реализована работа с неблокирующими сокетами. в сети примеров - куча. вобщем, select тебе в помощь smile - он и нагрузку снимет...
PM MAIL   Вверх
azesmcar
Дата 22.3.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211





Я привел пример...у меня реализовано почти также...
Вообще то select не особо поможет...мой select будет спать пока я не получу сообщение..а кто тогда будет делать accept?

Добавлено @ 15:42 
Цитата

судя по-всему, просто неверно реализована работа с неблокирующими сокетами


В каком смысле?? я же описал как я сделал. Что в этом неправильно?
PM   Вверх
dumb
Дата 22.3.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 1
Всего: 158



Цитата(azesmcar @  22.3.2007,  15:40 Найти цитируемый пост)
мой select будет спать пока я не получу сообщение..а кто тогда будет делать accept?

событие чтения возникает на listen-сокете, когда приходит новое соединение. после получения этого сообщения ты и должен делать accept.

Цитата(msdn(select))

If the socket is currently in the listen state, it will be marked as readable if an incoming connection request has been received such that an accept is guaranteed to complete without blocking. For other sockets, readability means that queued data is available for reading such that a call to recv, WSARecv, WSARecvFrom, or recvfrom is guaranteed not to block.


Добавлено @ 16:37 
кстати, пример твой сильно "детский". тебе посурьезнее нужен.  smile 
PM MAIL   Вверх
azesmcar
Дата 22.3.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата

событие чтения возникает на listen-сокете, когда приходит новое соединение. после получения этого сообщения ты и должен делать accept.


А вот это я кажется упустил из MSDN -а...совсем другое дело smile

Большое спасибо +1

Добавлено @ 16:46 
Цитата

кстати, пример твой сильно "детский". тебе посурьезнее нужен.  smile  


Знаю...Я не оттуда копировал..просто принцип работы похож...в смысле обработка данных...а то нормального примера я пока в интернете не видел с нормальной реализацией событий...пришлось самому писать.. smile

Это сообщение отредактировал(а) azesmcar - 22.3.2007, 16:47
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.