yüzden ben tcpip v6 kullanıyorum benim bir proje için ağ sistemi üzerinde çalışıyorum ve temelde paketin biçimi olması sahip karar verdiktenPaketler alındıktan sonra yollamanın başka yolları var mı? (Bu bilgiler alakalı olup olmadığını. A oyunda)
2 bytes: Packet ID
2 bytes: Packet Length
n bytes: Payload
Ben 65k farklı paket seçeneği olan bana kıpırdatmak oda bol verir ve bir paket hiç olmadığı kadar net büyüyor düşünemiyorum anlamaya (bir oyunda, bu saçma bir smidge olurdu.) Şu
, Bir int için bir işlev nesnesini eşleyen bir sırasız harita var:
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},
//...
};
paket işlerken
Ve, temelde böyle bir şey yapmak:
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");
Evet, hata kontrolü biraz hafif. Bu, gösterilecek örnek bir koddur.
Ama evet, kimliğine bağlı olarak paketleri yönlendirmenin başka yolları var mı? teknik olarak daha iyi olmasalar bile, alternatifleri bile bilmeniz bile eğitimsel amaçlar için uygun olacaktır.
Çok benzer evet. Sırasız bir harita kullandığım için, arama süresinin sabit kalacağı düşüncesiyle, o kadar çok etkiye sahip olacağını hayal bile edemiyorum. Çoğunlukla esneklik nedeniyle haritaya yapışıyordum. Bazı nedenlerden ötürü, geçerli bir sayı için paket kimliğini kontrol etmeyi tamamen unutmuşum, bunun için bir aptal gibi hissediyorum. Teşekkürler: D – Nemo