Я хотел с буста начать :) но вот когда я его скомпилировал, он весит 2,5 гигобайта) я передумал ...
А по ACE wrapper вообще доки не нашел)
Easy
> но вот когда я его скомпилировал, он весит 2,5 гигобайта) я передумал ...
Это со всеми временными файлами.
Либки гдето мегабайт 300-400 весят, и то ты ведь не со всем кодом линкуешься, а только с нужным.
ACE под С++ я когдато пробовал, ничего не понял, жутко не понравилось, так и бросил.
kvakvs, так я 3 раза написал что надо делать как можно проще )
> но вот когда я его скомпилировал, он весит 2,5 гигобайта) я передумал ...
Easy, ну а тебе не пофигу? Или религия запрещает использовать то, что на диске занимает больше 2 Гб? А студию юзаешь? ))
С бустом (асио), кстати, вообще очень удобно - в 200-300 строк запросто можно запихать полноценный сервер + клиент + работу с данными (приём, передача, разбор пакетов). После линковки прога будет размером 500-800 кб, не больше, так что о 2.5 Гб можно не беспокоиться. Да и, как верно написал, kvakvs, эти 2.5 Гб по большей части временные файлы сборки буста, которые можно просто грохнуть.
Ну сервер будет на линуксе, так что студию юзать не могу) Но компилировал да на виндовсе, когда хотел разобраться с ним.
Смотрю код буста
http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/example/… at_server.cpp
Такие дебри :D по крайней мере на первый взгляд :)
Буст я вообще не знаю, так что врятли у меня коротко получится с бустом...
Easy, каие там дебри? 
Ты смотри это не как на "много новых букаФФ", а просто начни с мэйна и по шагам посмотри что будет происходить и как. Уверен, если на листочеъке себе будешь рисовать то, что понимаешь - через полчаса уже будешь полностью знать как работает вся прога и сможешь написать свою такую же.
я вот только что понял, что видимо не какого прироста разбитие не даст... а даже возможно наоборот.
Что я сделал.
Класс который разбивает на потоки в зависимости от количества клиентов.
Каждые 1000 клиентов в отдельном потоке и с отдельным селектом.
То есть например имеем 10 000 клиентов. А пакет пришел только от одного, тогда только ё селект из 10 сработает и 1 поток из 10.
Но! Какая разница, пусть будут они в одном потоке все 10к.
Ведь селект вернёт список сокетов готовых для чтения. А следовательно он всё равно так же и вернёт 1ин сокет, и в цикле считаются данные из одного сокета.
То есть вывод: нужно в одном цикле читать?
slava_mib
> Ты смотри это не как на "много новых букаФФ", а просто начни с мэйна и по шагам
> посмотри что будет происходить и как. Уверен, если на листочеъке себе будешь
> рисовать то, что понимаешь - через полчаса уже будешь полностью знать как
> работает вся прога и сможешь написать свою такую же.
Дебри например typedef boost::shared_ptr<chat_session> chat_session_ptr;
Пришлось искать что это, как я понял shared_ptr это указатель на класс типа chat_session
Так какой плюс в
typedef boost::shared_ptr<chat_session> chat_session_ptr;
chat_server_ptr server.
в отличии от просто
chat_session * server;
я например не знаю) вот и сложно.
И так переписал с проверкой сокетов в одном канале.
http://pastebin.com/xEvVPMkB
Идея такая:
Имеется класс ServerThread - он обрабатывает сокеты. То есть ждёт конекта или читает из тех которые уже подключены.
Класс Client - каждый подключенный клиент создаёт новый экземпляр этого класса.
public ByteBuffer header = ByteBuffer.allocate(MAX_HEADER_LEN);
public ByteBuffer data = ByteBuffer.allocate(MAX_DATA_LEN);
public int data_len;
1. Создаём класс ServerThread в котором ждём коннект
2. Получили конект, добавили в Map<Socket, Client>
3. Получили команду на чтение из select читаем пока не получим длинну заголовка.
4. Заголовок прочитан, вызывае метод public void Header() для соответствующего клиента.
5. Парсим заголовок в классе клиент, получаем длину прикреплённых данных.
6. Если данные есть читаем данные.
Так вот. По идее в зависимости от опкода, я буду выполнять некие действия после получения полного пакета. Так как Функция вызывается из потока который читает сокеты, это будет на время подвешивать данный поток.
Думал пробегать в отдельном потоке по всем клиентам и проверять, если пакет полностью прочитан, то вызывать необходимые действия.
Но вот беда... Если бежать в бесконечном цикле, то это опять же даст нагрузку на процессор.
Так вот вопрос: как сделать так, что бы поток спал пока из Потока читающего сокеты не поступила команда? Типа wakeup() у select
Вот ещё надумал:
Сделать поток, и буфер в нём для пакетов.
Как только полностью получен пакет, помещать в буфер пакет и указатель на клиента.
Пока буфер пуст поток должен быть приостановлен, как только в буфер что то добавили поток нужно запустить.
Посмотри апач мина или netty для джавы
Ну мне сервер с постоянным соединением нужно, врятли апач подойдёт...
Сделал передачу через буфер в отдельный поток http://pastebin.com/cLh9VgLy
Оказывается есть хорошая штука у явы BlockingQueue.take() вешает поток если буфер пуст :)
> Так какой плюс в
>
> typedef boost::shared_ptr<chat_session> chat_session_ptr;
> chat_server_ptr server.
>
> в отличии от просто
> chat_session * server;
> я например не знаю) вот и сложно.
Easy, так это уже, простите, не в бусте сложности, а в том, что у тебя недостаток знаний по некоторым основам/шаблонам проектирования.
> То есть вывод: нужно в одном цикле читать?
Easy, я тебе уже не раз сказал, что так и надо делать ))) Но ты задаёшь вопросы, и при этом игноришь ответы )))
Смысла делать многопоточную сеть практически никакого нет, ИМХО. Потому как просто сеть это НЕ основная нагрузка на сервер и даже НЕ значительная её часть и даже НЕ хотя бы просто сколько-нибудь значимая. А основная нагрузка - это логика (обработка пакетов, игрового мира если у тебя игра, формирование данных для клиентов), вот её и надо параллелить.
Потому я и тебе выше и писал, что начинать надо с архитектуры приложения, а не с реализации. Потому что ты за 2 дня уже 3 раза поменял свои решения. В то время, как рассматривая всё на уровне архитектуры, ты мог бы сделать это за 3 часа, ни написав ни одной строки кода )
>Но вот беда... Если бежать в бесконечном цикле, то это опять же даст нагрузку на процессор.
Зачем ты так стремишься оптимизировать до сих пор не работающий нормально код - мне совсем не ясно...
Easy
> Ну мне сервер с постоянным соединением нужно, врятли апач подойдёт...
Вот почему если в названии продукта есть слово Apache, все сразу думают на Apache HTTPD :)
slava_mib
> Easy, так это уже, простите, не в бусте сложности, а в том, что у тебя
> недостаток знаний по некоторым основам/шаблонам проектирования.
Что такое шаблоны я прекрасно знаю. Но шаблоны что то делают, и что делает шаблон в данном случае я понятия не имею :)
slava_mib
> я тебе уже не раз сказал, что так и надо делать ))) Но ты задаёшь вопросы, и
> при этом игноришь ответы )))
Ну я просто в одной статье прочёл что надо в разных, и тут в ветке вы ответили ненадо а кто то написал надо, я не игнорирую и именно по этому пытаюсь выяснить надо или нет так как мнение делится.
slava_mib
> Зачем ты так стремишься оптимизировать до сих пор не работающий нормально код -
> мне совсем не ясно...
Код как бы работающий) Ну клиенты подключаются и заголовок пакета читается, то что пока не знаю какие будут опкоды и что нужно будет делать, вот это мне всё равно не даёт архитектуру приложения разработать :) Я вот знаю что нужно читать пакеты и отсылать, а что с ними делать не хнаю, вот и пытаюсь пока подготовить площадку, в которой уже останется сделать опкоды и их обработку.
kvakvs
> Вот почему если в названии продукта есть слово Apache, все сразу думают на
> Apache HTTPD :)
Я апач не открыл, но я открыл посмотреть третье название, и это вэб сервер) А то что апач тоже вэб сервер я знаю :) может конечно есть и не только вэбсервер :) Но при 2к одновременных конектов сервер апача виснет)
> Что такое шаблоны я прекрасно знаю. Но шаблоны что то делают, и что делает шаблон в данном случае я понятия не имею :)
Easy, шаблон с++ != шаблон проектирования )))
>Ну я просто в одной статье прочёл что надо в разных
В разных надо КОГДА надо )
> Ну клиенты подключаются и заголовок пакета читается, то что пока не знаю какие
> будут опкоды и что нужно будет делать, вот это мне всё равно не даёт
> архитектуру приложения разработать :) Я вот знаю что нужно читать пакеты и
> отсылать, а что с ними делать не хнаю, вот и пытаюсь пока подготовить площадку,
> в которой уже останется сделать опкоды и их обработку.
Easy, о чём я тебе и говорю - код сделан, он типа работает. А вот что дальше - пока неизвестно. Когда станет известно - тогда опять будешь сидеть и переделывать. Потом станет известно что-то и будет очередная переделка. И так до бесконечности...
С другой стороны, ты бы мог сесть, расписать на листочке бумаги всё, что тебе будет нужно - какие клиенты, какие данные, откуда, куда, как, в каких объёмах, что будет данные принимать/отправлять, что будет их обрабатывать, как оно будет это делать и т.д.
На выходе получил бы совершенно чёткое и понятное техническое задание (условно говоря), в котором уже были бы указаны все не обходимые компоненты системы, все методы их взаимодействия друг с другом, была бы видна большая часть подводных камней. По такому заданию работать можно смело и не думать о том, что завтра опять всё придётся переделывать ))
Ну и главное, что оно даст - ты будешь хотя бы сам понимать не только ЧТО ты делаешь, но и ДЛЯ ЧЕГО. Ты сейчас вот совершенно ошибочно зациклился на сети и её оптимизации. В то время, как в 99.9% случаев сеть это НЕ узкое место программы. Соответственно, если бы ты работал над тем, что на самом деле будет узким местом - получил бы эффект в сотни раз больше, чем оптимизация и так не тормозящей сети )
Но это, собственно, уже оффтоп )))
Я правил спелы, скилы, квесты, писал скрипты на инсты для сервера вов trinity, естественно основной код это код то что сервер вычисляет, но я вчера спросил тех кто игрушку пишет, что нажно от сервера? Предложил обсудить это)) Но тишина, как я понял что нужно от сервера я узнаю когда игрушка будет работать, если вообще будет :)
Я зациклился на сети именно потому тчо я не когда с сетью не работал. Хотелось бы узнать как сервера пишутся, посмотрел про сервер Аллодов запись, рассказывали архитектуру, но её так и не рассказали, то что мне нужно)
Вот следующий вопрос назревает, как реализовывают сервер логин и сервер мира отдельно?) По сути разные приложения обычно, подключается сокет к логин серверу, а после авторизации как подключится к Серверу Мира. вот каким образом?
И например чат сервер отдельно если то как он с игровым сервером связывается, тоже через сокет или есть другие механизмы о которых я не подозреваю и мне нужно погуглить)
Тема в архиве.