diff --git a/main.go b/main.go index ef2307e..de3a2cc 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "net" ) @@ -89,19 +90,33 @@ func handleConnection(client *ClientState) { for { n, err := client.conn.Read(buf) if err != nil { - fmt.Println("Error reading from connection or connection closed:", err) + if err.Error() == "EOF" { + fmt.Println("Client disconnected:", client.conn.RemoteAddr()) + } else { + fmt.Println("Error reading from client:", err) + } break } reader := bytes.NewReader(buf[:n]) + // Read packet length packetLength, err := readVarInt(reader) - if err != nil || packetLength > reader.Len() { - fmt.Println("Incomplete packet received") + if err != nil { + fmt.Println("Error reading packet length:", err) break } - packetID, err := readVarInt(reader) + // Ensure full packet is read + packetData := make([]byte, packetLength) + if _, err := io.ReadFull(reader, packetData); err != nil { + fmt.Println("Error reading full packet data:", err) + break + } + + packetReader := bytes.NewReader(packetData) + + packetID, err := readVarInt(packetReader) if err != nil { fmt.Println("Error reading packet ID:", err) break @@ -110,11 +125,15 @@ func handleConnection(client *ClientState) { fmt.Println("Packet ID:", packetID) switch packetID { - case HandshakePacketID | StatusRequestID: + case HandshakePacketID: // The same packet ID is used for the Status Request if client.nextState == 1 { handleStatusRequest(client) + } else if client.nextState == 2 { + fmt.Println("Received status request in the wrong state") + } else if client.nextState == 3 { + fmt.Println("Received status request in the wrong state") } else { - handshake, err := handleHandshake(reader) + handshake, err := handleHandshake(packetReader) if err != nil { fmt.Println("Error processing handshake:", err) return @@ -123,7 +142,7 @@ func handleConnection(client *ClientState) { } case PingRequestID: var timestamp int64 - if err := binary.Read(reader, binary.BigEndian, ×tamp); err != nil { + if err := binary.Read(packetReader, binary.BigEndian, ×tamp); err != nil { fmt.Println("Error reading timestamp:", err) break } @@ -183,7 +202,7 @@ func handleStatusRequest(client *ClientState) { } var packetData bytes.Buffer - packetData.WriteByte(StatusResponseID) + writeVarInt(&packetData, StatusResponseID) writeVarInt(&packetData, len(response)) packetData.Write(response)