Programm reagiert beim Ausführen anders als beim Debuggen



  • Habe wieder ein Problem mit der recv() Methode. Diesmal ist nicht ersichtlich, wieviele Bytes ich vom Server empfangen werde. Jedesmal wenn ich dann recv() nach der genannten Methode aufrufe, kommt der Fehler-code: 10053. Und wenn ich dann recv() ohne Schleife aufrufe, empfange ich 10 Bytes, was allerdings zu wenig sein dürfte... 🙄

    Meine Frage ist nun, was kann ich tun, wenn die Grösse des empfangenen Datenpakets unbekannt ist? 😕



  • Fehler 10053:
    An established connection was aborted by the software in your host computer, possibly due to a data transmission time-out or protocol error.

    die Verbindung is dir gerade Verlustig gegangen. Hab deine ganze Sache net beobachtet und auch net geschaut was du wie machst, aber das sieht mir aus wie ne UTP verbindung und die is nun mal Verbindungslos, also kannst du nur neu Anfragen. Wobei ich net verstehe warum es keinen Header gibt.

    na wie auch immer wenn ich daneben liegen sollte, dann vergiss was ich geschrieben habe



  • Also es ist eine TCP-Verbindung. Einen Paket-Header gibts auch, das 5. und 6. Byte geben die Paketgrösse an. Ich habs auch damit versucht, allerdings scheint die angegebene Datengrösse nicht zu stimmen. 😕
    Es fehlen ein paar Byte und dann kommt die Fehlermeldung 10055, weil ich zuwenig Buffer-Platz angebe.
    Das Datenpaket sieht wie folgt aus:

    2A 02 3D FE 00 22 00 01  00 03 00 00 82 95 E5 7A
      00 01 00 02 00 03 00 04  00 06 00 08 00 09 00 0A 
      00 0B 00 0C 00 13 00 15
    

    Die ersten 6 Bytes sind der Header und 00 22 geben die Grösse an, wobei die nicht stimmt, wenn man nachzählt, deshalb bin ich auch etwas verwirrt... wie ich die Grösse auslese, dass es passt...



  • hm, sorry, die grösse stimmt doch... ist ja hex... ich stand grad ziemlich aufm Schlauch 😃



  • Es funktioniert trotzdem nicht. Immer wieder kommt der Fehler-Code: 10053 😞
    Ich poste am Besten mal den Quellcode:

    int Oscar_ICQ::recvSupportedServices() {
            /*Buffer mit 0 belegen*/
    	for(int i = 0; i < BUFFERSIZE; i++) {
    		recvBuffer[i] = '\0';
    	}
            /*Vorerst Länge auf 16 setzen*/
    	int len = 16;
    	int r = 0;
    	int x = 0;
            /*Die ersten 16 Bytes empfangen*/
    	while(r < len) {
    		x = recv(con->getSocket(), recvBuffer + r, len - r, 0);
    		if(x == SOCKET_ERROR) 
    			return -1;
    		r += x;
    	}
            /*Grösse des Buffers aus Feld 4 und 5 auslesen*/
    	char val1 = recvBuffer[4];
    	char val2 = recvBuffer[5];
    	len = binary(val1, val2);  /*Berechnung der Grösse*/
    
    	r = 16; 
    	int curr = 0;
    	x = 0;
           /*Im Buffer ab der Stelle, an der aufgehört wurde die restlichen Bytes   
           lesen*/
            while( curr < len) {
    		x = recv(con->getSocket(), recvBuffer+r+curr, len - r, 0);
    		if(x == SOCKET_ERROR) 
    			return -1;
    		curr += x;
    	}/*Empfangene Bytesgrösse zurückgeben*/
    	return data_size = curr+16;
    }
    

  • Mod

    x = recv(con->getSocket(), recvBuffer+r+curr, len - r, 0);
    

    Kann nicht gehen! Du berücksichtigst curr nicht und liest evtl. damit zuviele Daten.



  • also dann so:

    x = recv(con->getSocket(), recvBuffer+r+curr, len - r [b] - curr[/b], 0);
    


  • Habs geändert, aber es liegt nicht daran. Es scheitert schon vorher, beim Einlesen der ersten 16 Bytes, da gibt die recv()-Funktion -1 zurück.



  • Hm, keiner eine Idee, woran es noch liegen könnte. Hab schon alles mögliche ausprobiert. Es werden immer nur 10 Bytes empfangen und die beinhalten nicht die Informationen über den Service. Praktisch bekomme ich nur den Header mit 6 Bytes und die Protokoll-Versions-Nr. mit 4 Bytes. Danach kommt nichts mehr und wenn ich den Puffer grösser mache, gibts die Fehlermeldung 10053. Habe echt keine Idee, was ich noch probieren könnte. 😞


  • Mod

    Dann werden wohl nicht mehr als 10 Bytes gepostet oder das Protokoll ist anders als Du es vermutest.



  • Hm, das kann natürlich sein, dass das Protokoll anders ist. Die Spezifikations-Erklärung, die ich herangezogen habe, ist auch schon ein paar Jährchen alt. Wäre natürlich möglich, dass sich da einiges geändert hat, oder dass die ICQ-Versions-Nr., die ich an den ICQ-Server sende, zu alt ist und deshalb keine möglichen Service-Informationen zugeschickt werden. Scheint also kein C++ spezifisches Problem zu sein. Nochmal Danke für die Hilfe. 🙂


Anmelden zum Antworten