ПрограммированиеФорумСеть

По несколько сокетов на поток (3 стр)

Страницы: 1 2 3 4 5 Следующая »
#30
20:12, 6 апр 2011

Я хотел с буста начать :) но вот когда я его скомпилировал, он весит 2,5 гигобайта) я передумал ...
А по ACE wrapper вообще доки не нашел)

#31
20:26, 6 апр 2011

Easy
> но вот когда я его скомпилировал, он весит 2,5 гигобайта) я передумал ...
Это со всеми временными файлами.
Либки гдето мегабайт 300-400 весят, и то ты ведь не со всем кодом линкуешься, а только с нужным.
ACE под С++ я когдато пробовал, ничего не понял, жутко не понравилось, так и бросил.

#32
21:01, 6 апр 2011

kvakvs, так я 3 раза написал что надо делать как можно проще )

> но вот когда я его скомпилировал, он весит 2,5 гигобайта) я передумал ...
Easy, ну а тебе не пофигу? Или религия запрещает использовать то, что на диске занимает больше 2 Гб? А студию юзаешь? ))

С бустом (асио), кстати, вообще очень удобно - в 200-300 строк запросто можно запихать полноценный сервер + клиент + работу с данными (приём, передача, разбор пакетов). После линковки прога будет размером 500-800 кб, не больше, так что о 2.5 Гб можно не беспокоиться. Да и, как верно написал, kvakvs, эти 2.5 Гб по большей части временные файлы сборки буста, которые можно просто грохнуть.

#33
21:13, 6 апр 2011

Ну сервер будет на линуксе, так что студию юзать не могу) Но компилировал да на виндовсе, когда хотел разобраться с ним.
Смотрю код буста
http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/example/… at_server.cpp
Такие дебри :D по крайней мере на первый взгляд :)

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

#34
21:22, 6 апр 2011

Easy, каие там дебри? O_O

Ты смотри это не как на "много новых букаФФ", а просто начни с мэйна и по шагам посмотри что будет происходить и как. Уверен, если на листочеъке себе будешь рисовать то, что понимаешь - через полчаса уже будешь полностью знать как работает вся прога и сможешь написать свою такую же.

#35
21:26, 6 апр 2011

я вот только что понял, что видимо не какого прироста разбитие не даст... а даже возможно наоборот.

Что я сделал.
Класс который разбивает на потоки в зависимости от количества клиентов.
Каждые 1000 клиентов в отдельном потоке и с отдельным селектом.
То есть например имеем 10 000 клиентов. А пакет пришел только от одного, тогда только ё селект из 10 сработает и 1 поток из 10.
Но! Какая разница, пусть будут они в одном потоке все 10к.
Ведь селект вернёт список сокетов готовых для чтения. А следовательно он всё равно так же и вернёт 1ин сокет, и в цикле считаются данные из одного сокета.

То есть вывод: нужно в одном цикле читать?

#36
21:29, 6 апр 2011

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;
я например не знаю) вот и сложно.

#37
3:24, 7 апр 2011

И так переписал с проверкой сокетов в одном канале.
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

Вот ещё надумал:
Сделать поток, и буфер в нём для пакетов.
Как только полностью получен пакет, помещать в буфер пакет и указатель на клиента.
Пока буфер пуст поток должен быть приостановлен, как только в буфер что то добавили поток нужно запустить.

#38
4:14, 7 апр 2011

Посмотри апач мина или netty для джавы

#39
7:37, 7 апр 2011

Ну мне сервер с постоянным соединением нужно, врятли апач подойдёт...

Сделал передачу через буфер в отдельный поток http://pastebin.com/cLh9VgLy
Оказывается есть хорошая штука у явы BlockingQueue.take() вешает поток если буфер пуст :)

http://bitbucket.org/rualex/jserver/src/

#40
10:52, 7 апр 2011

> Так какой плюс в
>
> typedef boost::shared_ptr<chat_session> chat_session_ptr;
> chat_server_ptr server.
>
> в отличии от просто
> chat_session * server;
> я например не знаю) вот и сложно.
Easy, так это уже, простите, не в бусте сложности, а в том, что у тебя недостаток знаний по некоторым основам/шаблонам проектирования.

> То есть вывод: нужно в одном цикле читать?
Easy, я тебе уже не раз сказал, что так и надо делать ))) Но ты задаёшь вопросы, и при этом игноришь ответы )))

Смысла делать многопоточную сеть практически никакого нет, ИМХО. Потому как просто сеть это НЕ основная нагрузка на сервер и даже НЕ значительная её часть и даже НЕ хотя бы просто сколько-нибудь значимая. А основная нагрузка - это логика (обработка пакетов, игрового мира если у тебя игра, формирование данных для клиентов), вот её и надо параллелить.

Потому я и тебе выше и писал, что начинать надо с архитектуры приложения, а не с реализации. Потому что ты за 2 дня уже 3 раза поменял свои решения. В то время, как рассматривая всё на уровне архитектуры, ты мог бы сделать это за 3 часа, ни написав ни одной строки кода )

>Но вот беда... Если бежать в бесконечном цикле, то это опять же даст нагрузку на процессор.
Зачем ты так стремишься оптимизировать до сих пор не работающий нормально код - мне совсем не ясно...

#41
10:54, 7 апр 2011

Easy
> Ну мне сервер с постоянным соединением нужно, врятли апач подойдёт...
Вот почему если в названии продукта есть слово Apache, все сразу думают на Apache HTTPD :)

#42
14:49, 7 апр 2011

slava_mib
> Easy, так это уже, простите, не в бусте сложности, а в том, что у тебя
> недостаток знаний по некоторым основам/шаблонам проектирования.
Что такое шаблоны я прекрасно знаю. Но шаблоны что то делают, и что делает шаблон в данном случае я понятия не имею :)

slava_mib
> я тебе уже не раз сказал, что так и надо делать ))) Но ты задаёшь вопросы, и
> при этом игноришь ответы )))
Ну я просто в одной статье прочёл что надо в разных, и тут в ветке вы ответили ненадо а кто то написал надо, я не игнорирую и именно по этому пытаюсь выяснить надо или нет так как мнение делится.

slava_mib
> Зачем ты так стремишься оптимизировать до сих пор не работающий нормально код -
> мне совсем не ясно...
Код как бы работающий) Ну клиенты подключаются и заголовок пакета читается, то что пока не знаю какие будут опкоды и что нужно будет делать, вот это мне всё равно не даёт архитектуру приложения разработать :) Я вот знаю что нужно читать пакеты и отсылать, а что с ними делать не хнаю, вот и пытаюсь пока подготовить площадку, в которой уже останется сделать опкоды и их обработку.

kvakvs
> Вот почему если в названии продукта есть слово Apache, все сразу думают на
> Apache HTTPD :)
Я апач не открыл, но я открыл посмотреть третье название, и это вэб сервер) А то что апач тоже вэб сервер я знаю :) может конечно есть и не только вэбсервер :) Но при 2к одновременных конектов сервер апача виснет)

#43
15:04, 7 апр 2011

> Что такое шаблоны я прекрасно знаю. Но шаблоны что то делают, и что делает шаблон в данном случае я понятия не имею :)
Easy, шаблон с++ != шаблон проектирования )))

>Ну я просто в одной статье прочёл что надо в разных
В разных надо КОГДА надо )

> Ну клиенты подключаются и заголовок пакета читается, то что пока не знаю какие
> будут опкоды и что нужно будет делать, вот это мне всё равно не даёт
> архитектуру приложения разработать :) Я вот знаю что нужно читать пакеты и
> отсылать, а что с ними делать не хнаю, вот и пытаюсь пока подготовить площадку,
> в которой уже останется сделать опкоды и их обработку.
Easy, о чём я тебе и говорю - код сделан, он типа работает. А вот что дальше - пока неизвестно. Когда станет известно - тогда опять будешь сидеть и переделывать. Потом станет известно что-то и будет очередная переделка. И так до бесконечности...

С другой стороны, ты бы мог сесть, расписать на листочке бумаги всё, что тебе будет нужно - какие клиенты, какие данные, откуда, куда, как, в каких объёмах, что будет данные принимать/отправлять, что будет их обрабатывать, как оно будет это делать и т.д.

На выходе получил бы совершенно чёткое и понятное техническое задание (условно говоря), в котором уже были бы указаны все не обходимые компоненты системы, все методы их взаимодействия друг с другом, была бы видна большая часть подводных камней. По такому заданию работать можно смело и не думать о том, что завтра опять всё придётся переделывать ))

Ну и главное, что оно даст - ты будешь хотя бы сам понимать не только ЧТО ты делаешь, но и ДЛЯ ЧЕГО. Ты сейчас вот совершенно ошибочно зациклился на сети и её оптимизации. В то время, как в 99.9% случаев сеть это НЕ узкое место программы. Соответственно, если бы ты работал над тем, что на самом деле будет узким местом - получил бы эффект в сотни раз больше, чем оптимизация и так не тормозящей сети )

Но это, собственно, уже оффтоп )))

#44
15:17, 7 апр 2011

Я правил спелы, скилы, квесты, писал скрипты на инсты для сервера вов trinity, естественно основной код это код то что сервер вычисляет, но я вчера спросил тех кто игрушку пишет, что нажно от сервера? Предложил обсудить это)) Но тишина, как я понял что нужно от сервера я узнаю когда игрушка будет работать, если вообще будет :)

Я зациклился на сети именно потому тчо я не когда с сетью не работал. Хотелось бы узнать как сервера пишутся, посмотрел про сервер Аллодов запись, рассказывали архитектуру, но её так и не рассказали, то что мне нужно)

Вот следующий вопрос назревает, как реализовывают сервер логин и сервер мира отдельно?) По сути разные приложения обычно, подключается сокет к логин серверу, а после авторизации как подключится к Серверу Мира. вот каким образом?
И например чат сервер отдельно если то как он с игровым сервером связывается, тоже через сокет или есть другие механизмы о которых я не подозреваю и мне нужно погуглить)

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумСеть

Тема в архиве.