private bool RecvInfo() { int recv = 0; byte[] buffer = new byte[1400]; try { recv = m_Socket.SendTo(QueryMsg.InfoQuery, m_serverEndPoint); recv = m_Socket.ReceiveFrom(buffer, ref m_remoteEP); } catch (Exception) { return(false); } //string requestBuffer = Encoding.UTF8.GetString(buffer).Substring(7); if ((byte)MsgHeader.A2S_INFO != buffer[4]) { return(false); } m_rqstInfo.protocolVersion = buffer[5]; // Protocol Version int idx = 6; m_rqstInfo.serverName = MainApp.BufferToString(buffer, ref idx); if (String.IsNullOrEmpty(m_rqstInfo.serverName)) { return(false); } m_rqstInfo.map = MainApp.BufferToString(buffer, ref idx); if (String.IsNullOrEmpty(m_rqstInfo.map)) { return(false); } m_rqstInfo.gameDirectory = MainApp.BufferToString(buffer, ref idx); if (String.IsNullOrEmpty(m_rqstInfo.gameDirectory)) { return(false); } m_rqstInfo.gameName = MainApp.BufferToString(buffer, ref idx); if (String.IsNullOrEmpty(m_rqstInfo.gameName)) { return(false); } byte[] idBuffer = new byte[2]; Array.Copy(buffer, idx, idBuffer, 0, 2); // idx ~ endIdx - 1 m_rqstInfo.appID = (short)(idBuffer[0] + (idBuffer[1] << 8)); idx += 2; m_rqstInfo.players = buffer[idx]; m_rqstInfo.maxPlayers = buffer[idx + 1]; m_rqstInfo.bots = buffer[idx + 2]; m_rqstInfo.serverType = buffer[idx + 3]; m_rqstInfo.os = buffer[idx + 4]; m_rqstInfo.visibility = buffer[idx + 5]; m_rqstInfo.vac = buffer[idx + 6]; idx += 7; m_rqstInfo.gameVersion = MainApp.BufferToString(buffer, ref idx); if (String.IsNullOrEmpty(m_rqstInfo.gameVersion)) { return(false); } m_NStat = NetworkStatus.Online; return(true); }
private void RecvPlayer() { int recv = 0; byte[] buffer = new byte[1400]; try { recv = m_Socket.SendTo(QueryMsg.PlayerQuery, m_serverEndPoint); recv = m_Socket.ReceiveFrom(buffer, ref m_remoteEP); } catch (Exception) { return; } if ((byte)MsgHeader.A2S_CHALLENGE != buffer[4]) { m_Socket.Close(); InitSocket(); return; } byte[] challengeQuery = { 0xFF, 0xFF, 0xFF, 0xFF, 0x55, buffer[5], buffer[6], buffer[7], buffer[8] }; buffer = new byte[1400]; try { recv = m_Socket.SendTo(challengeQuery, m_serverEndPoint); recv = m_Socket.ReceiveFrom(buffer, ref m_remoteEP); } catch (Exception) { return; } if ((byte)MsgHeader.A2S_PLAYER != buffer[4]) { m_Socket.Close(); InitSocket(); return; } foreach (RQST_PLAYER exstPlayer in m_rqstPlayerList) { exstPlayer.isCheck = false; } int idx = 5; int numPlayer = buffer[idx]; // player cnt ++idx; for (int i = 0; i < numPlayer; ++i) { RQST_PLAYER player = new RQST_PLAYER(); ++idx; player.playerName = MainApp.BufferToString(buffer, ref idx); if (String.IsNullOrEmpty(player.playerName)) { continue; } byte[] scoreBuffer = new byte[4]; Array.Copy(buffer, idx, scoreBuffer, 0, 4); player.score = (int)(scoreBuffer[0] + (scoreBuffer[1] << 8) + (scoreBuffer[2] << 16) + (scoreBuffer[3] << 24)); idx += 4; byte[] timeBuffer = new byte[4]; Array.Copy(buffer, idx, timeBuffer, 0, 4); player.time = BitConverter.ToSingle(timeBuffer, 0); idx += 4; int exstPlayerIdx = -1; for (int j = 0; j < m_rqstPlayerList.Count; ++j) { if (m_rqstPlayerList[j].playerName == player.playerName) { exstPlayerIdx = j; break; } } if (-1 == exstPlayerIdx) { player.isCheck = true; m_rqstPlayerList.Add(player); } else { m_rqstPlayerList[exstPlayerIdx].playerName = player.playerName; m_rqstPlayerList[exstPlayerIdx].score = player.score; m_rqstPlayerList[exstPlayerIdx].time = player.time; m_rqstPlayerList[exstPlayerIdx].isCheck = true; } } for (int i = 0; i < m_rqstPlayerList.Count;) { if (m_rqstPlayerList[i].isCheck == false) { m_rqstPlayerList.RemoveAt(i); } else { ++i; } } }