Занялся работой с сетью(на данный момент полный нуб в этой сфере). В статье описывается только "начало" работы - блокирующие сокеты не очень то юзабельны.
От сети мне требуется:
- нужно написать простенькую оболочку над функциями чтобы получилось примерно следующее: сетевай код постоянно принимает данные из сети и пишет их буферы (у каждого сокета свой буфер в котором храниться пришедшая информация). Получаю информацию из буферов с помощью функций похожих на `getNext4bytes()` `getNextByte()`
- сервер в состоянии работать с большим кол-вом клиентов (ММО, 2к+ клиентов)
посоветуйте пожалуйста статейки или информацию (технологии) с помощбю которых можно реализовать вышеизложеное. Муторно немножко написано, надеюсь поймете )))
перечитывал форум - пишут в основном что используют IOCP и boost::asio. Что лучше ? какие подводные камни? и вообще подходит ли эти технологии или искать что то другое?
asio - жутко тяжелая штука, которая даже с прекомпилированными хидерами увеличивает время компиляции как минимум на секунд 5. Зачем оно надо?
Могу за просто так поделиться своим работающим велосипедом.
Буду очень рад если поделишся)))
Так как делал для собственного пользования, в тексте нет пояснений как этим пользоваться...
MarkoPolo
а вот мое мнение что asio жутко хорошая весчь.
Antoha2
используй asio, о камнях сообщиш :)
я вот тут пишу сервер на asio - http://axe-engine.sourceforge.net/
В общем, опишу функции, а с аргументами сам разберешься.
Net_Init - запускаешь в перед тем как вообще что-либо делать дальше.
Net_CreateHandle - создает невидимое win32 окно, которое будет обрабатывать сообщения от сети.
Net_OpenSocket - создает сокет.
Net_BindToHandle - связывает сокет и хэндл полученный из Net_CreateHandle.
Net_GetHostName - показывает имя компа в сети
Net_GetHostIP - показывает все IP компа.
Net_Process - обработка сообщений.
Net_Stop - команда для хэндла, чтобы прекратить обрабатывать сообщения.
Net_Cleanup - после того, как все сделаешь, используешь ее для закрытия библиотеки.
Net_FillInAddr - заполняет структуру IP и портом для дальнейшего использования.
Net_SetOnAcceptCallback - установка функции возврата, когда получаем сообщение на подключение клиента.
Net_SetOnReadCallback - установка функции возврата, когда в буфере есть байты для чтения.
Net_SetOnWriteCallback - установка функции возврата, когда есть возможность писать в буфер.
Net_SetOnConnectCallback - установка функции возврата, когда подключается к серверу.
Net_SetOnCloseCallback - установка функции возврата, когда комп по ту сторону разорвал соединение.
Net_Send - посылает буфер заданного размера
Net_Recive - получает буфер максимального размера
Net_ConnectToServer - соединиться с заданным сервером.
Net_BindListenPort - Функция связывания для порта прослушки на сервере.
Net_ListenSocket - Функция для начала прослушки.
Net_GetLastError - последняя ошибка
Net_GetErrorString - текстовая строка ошибки
Net_GetSocketState - статус сокета
Есть две структуры:
Net_InBuffer, Net_OutBuffer для более удобной отправки-получения.
Net_InBuffer используется так:
1. Создаешь его где-нибудь.
2. В функции, которую повесил через Net_SetOnReadCallback делаешь следующее:
Use(), если Full(), то обрабатываем полученный кусок данных, затем Reset().
Net_OutBuffer - просто статический массив с шаблонными операторами << для удобного добавления байт.
Где-нибудь в главном цикле игры вызываешь Net_Process.
В общем-то все.
IROV..
Она может быть и хорошая, но она как я уже сказал жутко тяжелая...
IROV..
Исходники asio весят около 2 метров, в противовес моим 15 кило, плюс ваша надстройка это еще сколько-то...
MarkoPolo
может они не просто так весят? :)
моя настройка это моя настройка, это как пример
а вот решены ли у тебя те проблемы которые решены в асио? я думаю нет, думаю даже ты с ними не сталкивался, хотя дай бог мне ошибатся :)
IROV..
Когда столкнусь, то код можно расширить, а если не столкнусь, то зачем оно надо?
MarkoPolo
не хочется лишний раз сталкиватся с "детскими болезнями"
IROV..
хе-хе... бывает.
IROV..
>>я вот тут пишу сервер на asio - http://axe-engine.sourceforge.net/
чето там как-то пусто)
MarkoPolo
> Она может быть и хорошая, но она как я уже сказал жутко тяжелая...
сервак может весить сколько угодно
и компилиться тоже
главное, как раз, стабильность и отсутствие "детских болезней" ; )
>>сервак может весить сколько угодно
>>и компилиться тоже
>>главное, как раз, стабильность и отсутствие "детских болезней" ; )
не в размере суть. Есть поставленые задачи - ищеться решение для них. Возможно asio и крут и он просто убер, но муторный аж звиздец. яйца бы отрвать тем кто так пишет код везде все через щаред поинтеры, все в шаблонах.... блин хочеться хороших указателей пишите на C#,пока разбераешся в подобном коде невольно задумываешся а не сделать ли свой велосипед.
А кто что думает о IOCP ??
Antoha2
> А кто что думает о IOCP ??
а что про него думать? его юзать надо. под винду сервак только на нем и стоит писать (я не имею в виду обязательно напрямую, наверное логичнее взять какую-нить либу, которая его оборачивает в удобный интерфейс).
кстати, я сам не проверял, но тут народ писал, что asio на нем и сделан.
Тема в архиве.