MCPcopy Create free account
hub / github.com/NoMercy-ac/NoMercy / ProcessInput

Method ProcessInput

Source/Client/NM_Engine/ServerSocketAuth.cpp:113–211  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

111
112
113std::size_t CNetworkServer::ProcessInput(std::shared_ptr <CNetworkPeer> peer, const void* data, std::size_t maxlength)
114{
115 NETWORK_LOG(LL_SYS, "Peer: %s(%d) Data: %p Max length: %u", peer->GetIP().c_str(), peer->GetId(), data, maxlength);
116
117 auto pData = reinterpret_cast<const TPacketSingleton*>(data);
118 if (maxlength < sizeof(TPacketSingleton))
119 {
120 NETWORK_LOG(LL_CRI, "Packet size is so less!");
121 return 0;
122 }
123
124 NETWORK_LOG(LL_SYS, "Got Packet with magic: 0x%X id %d (%02x) size %u coming size %u received from Client %s (%d) at Phase: %d",
125 pData->pMagic, pData->uiPacketID, pData->uiPacketID, GetPacketCapacity(pData->uiPacketID), maxlength, peer->GetIP().c_str(), peer->GetId(), peer->GetPeerPhase());
126
127 // Magic value check
128 if (memcmp(pData->pMagic, gs_pNetworkMagicValue, sizeof(pData->pMagic)))
129 {
130 NETWORK_LOG(LL_CRI, "Unknown magic value: 0x%X", pData->pMagic);
131 return 0;
132 }
133
134 // ID check
135 auto handler = m_pPacketHandlers.find(pData->uiPacketID);
136 if (handler == m_pPacketHandlers.end())
137 {
138 NETWORK_LOG(LL_CRI, "Unknown Packet with id %d (%02x) received from client %s (%d)", pData->uiPacketID, pData->uiPacketID, peer->GetIP().c_str(), peer->GetId());
139 return 0;
140 }
141
142 // Size check
143 auto ulCorrectSize = GetPacketCapacity(pData->uiPacketID);
144 if (ulCorrectSize != maxlength)
145 {
146 NETWORK_LOG(LL_CRI, "Packet size mismatch! Correct: %u Current: %u Packet: %d (%02x)", ulCorrectSize, maxlength, pData->uiPacketID, pData->uiPacketID);
147 return 0;
148 }
149
150 // Hash check
151 auto pCorrectHash = XXH32(data, maxlength - NET_CHECKSUM_LENGTH, NET_PACKET_HASH_MAGIC);
152 auto pCurrentHash = *(uint32_t*)((std::size_t)data + maxlength - NET_CHECKSUM_LENGTH);
153
154 NETWORK_LOG(LL_SYS, "Hash: %p Correct hash: %p Eq: %d", pCurrentHash, pCorrectHash, pCurrentHash == pCorrectHash);
155 if (pCurrentHash != pCorrectHash)
156 {
157 NETWORK_LOG(LL_CRI, "Packet hash mismatch! Current: %p Correct: %p", pCurrentHash, pCorrectHash);
158 return GetPacketCapacity(pData->uiPacketID);
159 }
160
161 // Phase check
162 auto newPhase = PHASE_NULL;
163 auto peerPhase = peer->GetPeerPhase();
164 if (peerPhase != PHASE_CHECK_COMPLETED)
165 {
166 auto bDestroyPeer = false;
167 if (peerPhase == PHASE_CONN_REQUEST)
168 {
169 if (pData->uiPacketID != HEADER_CS_CONN_INIT)
170 bDestroyPeer = true;

Callers 1

OnReadMethod · 0.45

Calls 6

GetPacketCapacityFunction · 0.85
GetPeerPhaseMethod · 0.80
endMethod · 0.80
SetPeerPhaseMethod · 0.80
GetIdMethod · 0.45
DisconnectMethod · 0.45

Tested by

no test coverage detected