Wargame: Fehler im Program?
-
Hi nochmal,
ich sitze gerade an dem Wargame http://www.pulltheplug.org/wargames/vortex/level00.html. Ziel ist es die Empfangenen Nummern zu addieren und zurückzuschicken. Dazu habe ich folgendes Programm zusammengeschustert:int main() { //ServerDo(server,port,select Timeout) ServerDo server("vortex.labs.pulltheplug.org",5842,10); server.connect(); //get the values and add them unsigned int buf[100]; recv(server.getSock(),buf,sizeof(buf),0); cout<<"got: "<<endl<<buf[0]<<endl<<buf[1]<<endl<<buf[2]<<endl <<buf[3]<<endl; double sum = (double)buf[0]+buf[1]+buf[2]+buf[3]; cout.precision(15); cout<<"= "<<sum<<endl; cout<<"sending "<<sum<<" as solution"<<endl; //return the sum ostringstream msg; msg.precision(15); msg<<sum; cout<<msg.str()<<endl; send(server.getSock(),msg.str().c_str(), sizeof(msg.str().c_str()),0); //and take the answer char buf2[100]; cout<<"received: "; recv(server.getSock(),buf2,sizeof(buf2),0); cout<<string(buf2)<<endl; return 1; }Leider bekomme ich nur folgenden Müll anstatt der Zugangsdaten:
connection created
got:
1936349413
3086801708
3086801800
64971124
= 8174924045
sending 8174924045 as solution
8174924045
received: +äE"hi°C¹~#ð·Hat jemand eine Idee, warum ich so ein Müll bekomm? Danke!

-
Du benutzt sizeof, weil du glaubst, dass es dir die Länge eines Strings liefert. Das ist aber nicht so.
-
hmm, nicht? habs jetzt mal mit strlen probiert und selbe confuse ergebnis:
received: Ù%
-
guys? irgendwelche ideen woran es liegen könnte?
-
nimm doch length():
send(server.getSock(),msg.str().c_str(),msg.str().length(),0);(btw, was hängt eigentlich am anderen Ende deines Sockets?)
-
lenth hilft auch nicht (is ja eigentlich auch das selbe wie strlen(), oder)
Am anderen ende hängt:
ServerDo server("vortex.labs.pulltheplug.org",5842,10);mehr weis ich auch nicht. Installier gerade mal Ethereal, vlt haperts ja nur bei der ausgabe. Sonst noch Ideen was das Problem sein könnte?
-
Ist dir bewußt das recv auch z.B. nur mit einem Byte zurückkehren kann?
-
Und was soll mir das sagen? dass ich mehrere recvs abfangen soll? Aber müsste das erste dann nicht trotzdem ein 'l'(ogin) oder was anderes lesbares sein? Ich aber krieg ja nur müll zurück:
YÒeyaf¥JN
-
ich getraue mich mal, ohne wirklich erfahrung mit den sockets zu haben, ins blaue raus zu raten und würde behaupten, dass bei:
recv(server.getSock(),buf2,sizeof(buf2),0);eher etwas in diese richtung sein müsste
recv(server.getSock(),&buf2,strlen(buf2),0);
-
1. Wieso sollte man einen String in der Länge des bisherigen Strings empfangen wollen?

2. Der Name eines Arrays kann als Zeiger auf sein erstes Element genutzt werdenDes Rätsels Lösung liegt wahrscheinlich einfach in der Korrekten Benutzung von send und recv (Hint: ......Rückgabewert.......)
EDIT:
Ach, noch ein Hint: ......Nullterminierung......
-
Hmm, sry ich brauche doch noch einmal eure Hilfe

Ich habe das Program jetzt so modifiziert, dass die Antwort folgendermaßen entgegengenommen und ausgegeben wird:
//and take the answer char buf2[100]; for(unsigned int i=0;i<sizeof(buf2);i++){buf2[i]=0;} cout<<"received "; cout<<recv(server.getSock(),buf2,sizeof(buf2),0); cout<<" bytes:"<<endl; for(unsigned int i=0;i<strlen(buf2);i++) { if( buf[i]==0) {cout<<endl;} else{ cout<<buf[i]<<" "; } } cout<<endl; return 1;Dadurch erhalte ich als Antwort:
received 12 bytes:
961150710 3086187308 3086187400 64971124 134514720 3086352340
3086354068 3215310212 3086294814 134513552 3215310144Meint ihr, die Antwort ist ein Code den es zu knacken gilt oder habe ich mich hier nur wieder verprogrammiert?
-
Ich denke mal, du hast da ein paar Variablen verwechselt - dein recv()-Aufruf füllt das Array 'buf2', aber anschließend gibst du den Inhalt von 'buf' aus.
(PS: Statt der ersten Schleife kannst du auch memset() verwenden - das ist womöglich effizienter)