02. september 2004 - 18:08
Der er
20 kommentarer og 1 løsning
Endnu et spørgsmål, copy buffer ind i en struct.
Hejsa, endnu et ignorant spørgsmål... lad os sige jeg har en struct det hedder det her struct CS_LoginPacket { string username; string password; DWORD ip; }; der skal jeg så copy en buffer ind, der indeholder det her f.eks string: username (null terminatet) string: password (null terminatet) DWORD: ip (4 bytes DWORD) prøvede forskellige måder, men ingen syntes at virke, nogen der har prøvet noget ligende før ? MVH Bo.
Annonceindlæg fra DE-CIX
02. september 2004 - 18:14
#1
Er det ikke bare at assigne ? struct CS_LoginPacket pckt; char *username; char *password; int ip; pckt.username = username; pckt.password = password; pckt.ip = ip;
02. september 2004 - 18:22
#2
nej jeg får den buffer fra en client på mit netværks system void checkname(char buffer, DWORD ptr) { int packsize = sizeof(buffer); struct CS_LoginPacket lp; //her mangler } jeg får en pakke ind, fjerner min første byte før jeg sender den over (opcode), og skal derefter smide resten ind i min struct. eg: memcpy(lp, buffer, sizeof(buffer); ja ved godt den self ikke virker, men bare for at du får ideen min pakke i bytes f.eks ser sådan her ud 0x32 0x45 0x32 0x45 0x45 0x00 (null) 0x45 0x48 0x63 0x32 0x00 (null) 0x32 0x21 0x11 022 som du kan se er det en string (null) string (null) og sidst dword, det skal så smides ind i min struct for at jeg kan tjekke username og password med det fra databasen.
02. september 2004 - 18:29
#3
char *username = buffer; lp.username = username; char *password = buffer + strlen(username) + 1; lp.password = password; int *ip = (int *)(buffer + strlen(username) + 1 + strlen(password) + 1); lp.ip = *ip;
02. september 2004 - 18:30
#4
Jeg antager at det er: void checkname(char *buffer, DWORD ptr) og ikke: void checkname(char buffer, DWORD ptr)
02. september 2004 - 18:30
#5
Og den her kan ikke bruges til noget: int packsize = sizeof(buffer);
02. september 2004 - 19:00
#6
hhmm ser ikke ud som om det virker o.o
02. september 2004 - 19:02
#7
smider den ind sådan her: checkname((char *)&recdata[1], ptr); starter fra recdata[1] fordi den første byte er opcoden, så der kun er navn & password & ip i pakken. derefter: void checkname(char * buffer, DWORD ptr) { struct CS_LoginPacket lp; char* username = buffer; lp.username = username; char* password = buffer + strlen(username) + 1; lp.password = password; int* ip = (int*)(buffer + strlen(username) + 1 + strlen(password) + 1); lp.ip = *ip; // test, remove after working. Log2File(TRUE, "Login request test %d\n", lp.username); PacketLog((unsigned char*)&lp, sizeof(lp)); // send login ok for test purposes. sendloginoktest(ptr); return; }
02. september 2004 - 19:03
#8
sorry Log2File(TRUE, "Login request test %d\n", lp.username); skulle være Log2File(TRUE, "Login request test %s\n", lp.username); men så crasher programmet
02. september 2004 - 19:05
#9
aah, loggede lige buffer efter den røg over, der er der kun brugernavnet i, dvs den kutter åbenbart pakken ved først 0x00
02. september 2004 - 19:08
#10
whops, den smider det rigtige over, my bad, brugte forkert size til logging lol... :( damn jeg er en fjols..
02. september 2004 - 19:11
#11
Det virker ?
02. september 2004 - 19:13
#12
nops.
02. september 2004 - 19:19
#13
whops min fejl, dword er size 4 pga der er nogen bytes efter der bare skal ignores :( sorry string username string password dword ip[4] resten ignoreres
02. september 2004 - 19:19
#14
#include <windows.h> #include <iostream> #include <string> #include <cstring> using namespace std; struct CS_LoginPacket { string username; string password; DWORD ip; }; void checkname(char * buffer, DWORD ptr) { struct CS_LoginPacket lp; char* username = buffer; lp.username = username; char* password = buffer + strlen(username) + 1; lp.password = password; int* ip = (int*)(buffer + strlen(username) + 1 + strlen(password) + 1); lp.ip = *ip; cout << lp.username << endl; cout << lp.password << endl; cout << lp.ip << endl; } int main() { char b[] = { 0x32, 0x45, 0x32, 0x45, 0x45, 0x00, 0x45, 0x48, 0x63, 0x32, 0x00, 0x32, 0x21, 0x11, 022 }; checkname(b, 0); return 0; } udskriver: 2E2EE EHc2 303112498 hos mig hvilket ser OK ud.
02. september 2004 - 19:22
#15
eksempel username password ip ignore [46 64 73 61 66 00] [66 64 73 61 66 00] [3E F3 9E 3C] [00 A8 21] jeg ved godt det ser UD som om ip er null termineret oxo, men det er den ikke.
02. september 2004 - 19:34
#16
#include <windows.h> #include <iostream> #include <string> #include <cstring> using namespace std; struct CS_LoginPacket { string username; string password; DWORD ip; }; void checkname(char * buffer, DWORD ptr) { struct CS_LoginPacket lp; char* username = buffer; lp.username = username; char* password = buffer + strlen(username) + 1; lp.password = password; int* ip = (int*)(buffer + strlen(username) + 1 + strlen(password) + 1); lp.ip = *ip; cout << lp.username << endl; cout << lp.password << endl; cout << lp.ip << endl; } int main() { char b[] = { 0x46, 0x64, 0x73, 0x61, 0x66, 0x00, 0x66, 0x64, 0x73, 0x61, 0x66, 0x00, 0x3E, 0xF3, 0x9E, 0x3C, 0x00, 0xA8, 0x21 }; checkname(b, 0); return 0; } giver: Fdsaf fdsaf 1017049918 hvilket også ser OK ud for mig.
02. september 2004 - 19:58
#17
hum, prøvede at debugge, det ser ud som om min lp.username indeholder en million milliard af ííííííí (ligner dem lidt).
02. september 2004 - 20:00
#18
det er vist hvis jeg bruger den her: WriteDataStr(hdwnd , "Login request for %s", lp.username); den skriver bare usernavnet (skulle den gerne om ikke andet) i min editbox. og den crasher fordi lp.username er større en 256 bytes som jeg har sat til max længde.
02. september 2004 - 20:03
#19
lp.username er en string ikke en char* Prøv: WriteDataStr(hdwnd , "Login request for %s", lp.username.c_str());
02. september 2004 - 20:05
#20
ja, det var der min fejl var, så virker det :P takker, hvis du smider et svar så får du lige pointsne
02. september 2004 - 20:05
#21
svar
Kurser inden for grundlæggende programmering