Так я работаю на сетевой системе для проекта шахты (игра, если такая информация актуальна.) Я использую Tcpip v6 и я решил в основном имеющий формат для данного пакета будетСуществуют ли другие способы маршрутизации пакетов после их получения?
2 bytes: Packet ID
2 bytes: Packet Length
n bytes: Payload
Я полагаю, что имея возможность 65k различных пакетов дает мне много манёвра, и я не могу себе представить пакет никогда не становится больше, чем (В игре, что это было бы глупо smidge.)
В настоящее время , У меня есть неупорядоченная карта, которая отображает int в функциональный объект:
std::unordered_map<unsigned int, std::function<void(char*, unsigned int)>> Map =
{
{PID_NULL, PacketGetNull},
{PID_USER_INFO, PacketGetUserInfo},
{PID_LOGIN_FAILED, PacketLoginFailed},
{PID_PRESENT_CHAR_LIST, PacketPresentCharList},
{PID_PRESENT_WORLD_LIST, PacketPresentWorldList},
{PID_CHAT, PacketChat},
{PID_ADD_FRIEND, PacketAddFriend},
{PID_REMOVE_FRIEND, PacketRemoveFriend},
//...
};
И при обработке пакета, я в принципе сделать что-то вроде этого:
unsigned short PacketID = 0;
unsigned short PacketLen = 0;
PACKET_READ(Packet, unsigned short, Pos, PacketID);
PACKET_READ(Packet, unsigned short, Pos, PacketLen);
auto Iter = Map.find(PacketID);
if (Iter != Map.end())
Iter->second(Packet, PacketLen);
else
printf("Error, packet type not found!\n");
Да, это немного света на проверку ошибок. Это просто пример кода для демонстрации.
Но да, существуют ли другие способы маршрутизации пакетов в зависимости от их идентификатора? Даже если они не будут технически лучше, даже знание альтернатив будет аккуратным, если только в образовательных целях.
Очень похоже да. Поскольку я использую неупорядоченную карту, предположительно, время поиска будет постоянным, поэтому я не могу себе представить, что это будет иметь такой эффект. В основном я придерживаюсь карты, а не соображения гибкости. По какой-то причине я совершенно забыл о проверке идентификатора пакета для действительных номеров, но для этого чувствую себя идиотом. Спасибо – Nemo