public EBattlEyeCommandResult SendCommandPacket(string command) { try { if (!_socket.Connected) { return(EBattlEyeCommandResult.NotConnected); } var crc32 = new CRC32(); string packet; string header = "BE"; string hash = crc32.ComputeHash(Helpers.String2Bytes(Helpers.Hex2Ascii("FF01") + Helpers.Bytes2String(new byte[] { 0 }) + command)).Aggregate <byte, string>(null, (current, b) => current + b.ToString( "X2")); hash = Helpers.Hex2Ascii(hash); hash = new string(hash.ToCharArray().Reverse().ToArray()); header += hash; packet = header + Helpers.Hex2Ascii("FF01") + Helpers.Bytes2String(new byte[] { 0 }) + command; _socket.Send(Helpers.String2Bytes(packet)); _commandSend = DateTime.Now; } catch { return(EBattlEyeCommandResult.Error); } return(EBattlEyeCommandResult.Success); }
private byte[] ConstructPacket(BattlEyePacketType packetType, int sequenceNumber, string command) { string type; switch (packetType) { case BattlEyePacketType.Login: type = Helpers.Hex2Ascii("FF00"); break; case BattlEyePacketType.Command: type = Helpers.Hex2Ascii("FF01"); break; case BattlEyePacketType.Acknowledge: type = Helpers.Hex2Ascii("FF02"); break; default: return(new byte[] { }); } if (packetType != BattlEyePacketType.Acknowledge) { if (command != null) { command = Encoding.GetEncoding(1252).GetString(Encoding.UTF8.GetBytes(command)); } } string count = Helpers.Bytes2String(new byte[] { (byte)sequenceNumber }); byte[] byteArray = new CRC32().ComputeHash(Helpers.String2Bytes(type + ((packetType != BattlEyePacketType.Command) ? "" : count) + command)); string hash = new string(Helpers.Hex2Ascii(BitConverter.ToString(byteArray).Replace("-", "")).ToCharArray().Reverse().ToArray()); string packet = "BE" + hash + type + ((packetType != BattlEyePacketType.Command) ? "" : count) + command; return(Helpers.String2Bytes(packet)); }
private void ReceiveCallback(IAsyncResult ar) { try { StateObject state = (StateObject)ar.AsyncState; Socket client = state.WorkSocket; // this method can be called from the middle of a .Disconnect() call // test with Debug > Exception > CLR exs on if (!client.Connected) { return; } int bytesRead = client.EndReceive(ar); if (state.Buffer[7] == 0x02) { SendAcknowledgePacket(Helpers.Bytes2String(new[] { state.Buffer[8] })); OnBattlEyeMessage(Helpers.Bytes2String(state.Buffer, 9, bytesRead - 9), 256); } else if (state.Buffer[7] == 0x01) { if (bytesRead > 9) { if (state.Buffer[7] == 0x01 && state.Buffer[9] == 0x00) { if (state.Buffer[11] == 0) { state.PacketsTodo = state.Buffer[10]; } if (state.PacketsTodo > 0) { state.Message.Append(Helpers.Bytes2String(state.Buffer, 12, bytesRead - 12)); state.PacketsTodo--; } if (state.PacketsTodo == 0) { OnBattlEyeMessage(state.Message.ToString(), state.Buffer[8]); state.Message = new StringBuilder(); state.PacketsTodo = 0; } } else { // Temporary fix to avoid infinite loops with multi-packet server messages state.Message = new StringBuilder(); state.PacketsTodo = 0; OnBattlEyeMessage(Helpers.Bytes2String(state.Buffer, 9, bytesRead - 9), state.Buffer[8]); } } if (packetQueue.ContainsKey(state.Buffer[8]) && state.PacketsTodo == 0) { packetQueue.Remove(state.Buffer[8]); } } packetReceived = DateTime.Now; client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } catch { // do nothing } }
private void ThreadReceive() { byte[] buffer = new byte[2048]; StringBuilder message = new StringBuilder(); int packetsTodo = 0; while (keepRunning) { try { int bytesRead = socket.Receive(buffer, 0); if (bytesRead > 0) { if (buffer[7] == 0x02) { SendAcknowledgePacket(Helpers.Bytes2String(new[] { buffer[8] })); OnBattlEyeMessage(Helpers.Bytes2String(buffer, 9, bytesRead - 9), 256); } else if (buffer[7] == 0x01) { if (bytesRead > 9) { if (buffer[7] == 0x01 && buffer[9] == 0x00) { if (buffer[11] == 0) { packetsTodo = buffer[10]; } if (packetsTodo > 0) { message.Append(Helpers.Bytes2String(buffer, 12, bytesRead - 12)); packetsTodo--; } if (packetsTodo == 0) { OnBattlEyeMessage(message.ToString(), buffer[8]); message = new StringBuilder(); packetsTodo = 0; } } else { // Temporary fix to avoid infinite loops with multi-packet server messages message = new StringBuilder(); packetsTodo = 0; OnBattlEyeMessage(Helpers.Bytes2String(buffer, 9, bytesRead - 9), buffer[8]); } } mtxQueue.WaitOne(); try { if (packetQueue.ContainsKey(buffer[8])) { packetQueue.Remove(buffer[8]); } } catch /*(Exception ex)*/ { } mtxQueue.ReleaseMutex(); } packetReceived = DateTime.Now; } } catch (Exception ex) { if (socket.Connected) { socket.Shutdown(SocketShutdown.Both); socket.Close(); } System.Diagnostics.Debug.Print(ex.Message); Thread.Sleep(5000); } } }
private void DoWork() { var bytesReceived = new Byte[4096]; int bytes = 0; string buffer = null; int bufferCount = 0; int packetCount = 0; _disconnectionType = EBattlEyeDisconnectionType.ConnectionLost; while (_socket.Connected && _keepRunning) { try { bytes = _socket.Receive(bytesReceived, bytesReceived.Length, 0); if (bytesReceived[7] == 0x02) { SendAcknowledgePacket(Helpers.Bytes2String(new[] { bytesReceived[8] })); OnMessageReceived(Helpers.Bytes2String(bytesReceived, 9, bytes - 9)); } else if (bytesReceived[7] == 0x01) { if (bytes > 9) { if (bytesReceived[7] == 0x01 && bytesReceived[9] == 0x00) { if (bytesReceived[11] == 0) { packetCount = bytesReceived[10]; } if (bufferCount < packetCount) { buffer += Helpers.Bytes2String(bytesReceived, 12, bytes - 12); bufferCount++; } if (bufferCount == packetCount) { OnMessageReceived(buffer); buffer = null; bufferCount = 0; packetCount = 0; } } else { // Temporary fix to avoid infinite loops with multi-packet server messages buffer = null; bufferCount = 0; packetCount = 0; OnMessageReceived(Helpers.Bytes2String(bytesReceived, 9, bytes - 9)); } } } _responseReceived = DateTime.Now; bytesReceived = new Byte[4096]; } catch (Exception) { if (_keepRunning) { Disconnect(EBattlEyeDisconnectionType.SocketException); } } } if (!_socket.Connected) { OnDisconnect(_loginCredentials, _disconnectionType); } }