C++ Tcp Packet Senden

Jonas Meyer

Mitglied
Hi,
ich habe ja vor ein Bot für Minecraft zu schreiben und habe mich dazu entschlossen einen eigenen Client zu schreiben.
Bloß wie bekomme ich das richtig sende.
http://wiki.vg/Protocol#Login_Request_.280x01.29
Auf der Seite steht ja Handshake (0x02).
Und mein Code sieht ja so aus:
C++:
strcpy_s(buf,"Packet");
rc=send(s,buf,sizeof(buf),0);
std::cout << "Antwort" << std::endl;
Muss ich jetzt einfach das machen?
C++:
strcpy_s(buf,"0x02");
Funktioniert das so?
 
Zuletzt bearbeitet von einem Moderator:
Hallo Jonas Meyer,

Nein, wie die meisten Protokolle ist auch das von Minecraft soweit ich in dem wiki sehe binär orientiert. Das heisst die gesendeten Daten werden nicht als Strings aufgefasst sondern direkt als entsprechende Binärdaten. Als Beispiel für das Packet mit der ID 2:

Gemäss Wiki beginnt jedes Packet mit einem Byte das die ID darstellt. Für Packet 2 kommt dann ein weiteres byte mit der Version des Protokolls, anschliessend zwei strings (ich gehe davon aus, diese werden 0-terminiert übertragen) und zum schluss noch ein int mit dem port.

C++:
typedef unsigned char BYTE;

std::string userName = "Cromon";
std::string serverAddress = "127.0.0.1";
int port = 35556;
BYTE protocol = 60;
BYTE id = 2;

std::vector<BYTE> data;
data.push_back(id);
data.push_back(protocol);
for(size_t i = 0; i < userName.length(); ++i)
     data.push_back((BYTE)userName[i]);

data.push_back(0); // 0-terminiert

for(size_t i = 0; i < serverAddress.length(); ++i)
     data.push_back((BYTE)serverAddress[i]));

data.push_back(0); // 0-terminiert

BYTE* portBytes = (BYTE*)&port;
for(size_t i = 0; i < sizeof(port); ++i)
     data.push_back(portBytes[i]));

send(mSocket, (const char*)data.data(), data.size(), 0);

Du kannst dir das so vorstellen dass eigentlich alle Variabeln im Speicher hintereinander gelegt werden und dann ein Abbild von diesem Speicherbereich an den Server gesendet wird.

Bedenken musst du folgendes:
Java verwendet ggf. nicht die gleiche Endianness wie dein Clientsystem.

/EDIT:
Dein Titel lässt vermuten dass du C++ verwendest. Da solltest du eigentlich unsichere C-Elemente wie Zeiger und vor allem C-Funktionen wie strcpy nur wenn nicht anders möglich verwenden. In meinem Codebeispiel habe ich versucht die Zeiger so gut es geht wegzulassen ohne dabei das zu verdunkeln was ich eigentlich aufzeigen möchte. In einer sauberen Applikation kannst du obigen Code komplett ohne Zeiger verwenden.

Grüsse
Cromon
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück