2016-03-29 2 views
0

Так я работаю на сетевой системе для проекта шахты (игра, если такая информация актуальна.) Я использую 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"); 

Да, это немного света на проверку ошибок. Это просто пример кода для демонстрации.

Но да, существуют ли другие способы маршрутизации пакетов в зависимости от их идентификатора? Даже если они не будут технически лучше, даже знание альтернатив будет аккуратным, если только в образовательных целях.

ответ

1

Я хотел бы предложить вам использовать массив/вектор функций, чтобы избежать позвонить в найти но дизайн похож на то, что вы уже делаете (код C) (недорого):

enum PacketID { 
    PID_NULL = 0, 
    PID_USER_INFO = 1, 
    /* ... */ 
    PID_NUM_OF_IDS 
}; 

void (*pkt_handler[])(char *, unsigned int) = { 
    PacketGetNull, 
    PacketGetUserInfo, 
    /* ... */ 
}; 

void HandlePacket(enum PacketID pkt_id, char *pkt, unsigned int pkt_len) 
{ 
    if (pkt_id >= PID_NUM_OF_IDS) { 
     printf("Error, packet type not found!\n"); 
     return; 
    } 

    pkt_handler[pkt_id](pkt, pkt_len); 
} 
+0

Очень похоже да. Поскольку я использую неупорядоченную карту, предположительно, время поиска будет постоянным, поэтому я не могу себе представить, что это будет иметь такой эффект. В основном я придерживаюсь карты, а не соображения гибкости. По какой-то причине я совершенно забыл о проверке идентификатора пакета для действительных номеров, но для этого чувствую себя идиотом. Спасибо – Nemo