Ist diese Methode okay?
-
Hallo,
mögt ihr euch das mal bitte anschauen und mir sagen ob ich da irgendwas grob falsch mache? Ich bin vorallem im Bezug auf die Größe des Buffers und das \0 terminieren unsicher.
int someClass::someMethod(int sock){ int ms = 1; // Buffer. char checkBuffer[CHECKBUFSIZE]; // Will hold the length of the reply. int len; // The message to send to the server. const char* message = "EHLO example.org\n\r\n\r"; // Send the message. send(sock,message,strlen(message),0); Timer t; t.startTimer(); // Read the answer and keep the length of the reply. len = read(sock,checkBuffer,CHECKBUFSIZE-1); ms = t.stopTimer(); // Quit message to close the connection. const char* quitMessage = "QUIT"; // Send the quit message. send(sock,quitMessage,strlen(quitMessage),0); // Terminate the string if the reply was not too long. if(len < CHECKBUFSIZE){ checkBuffer[len+1] = '\0'; }else{ return 0; } // Make it easier for us to substr(). stringstream reply; reply << checkBuffer; // If the first three chars are "220", there is a SMTP server running. if(reply.str().substr(0,3) == "220") return ms; return 0; }Dankeschön!
-
Beim überfliegen einen "1 daneben fehler" gefunden
checkBuffer[len+1] = '\0';Das +1 muss weg
-
Okay, Denkfehler. checkBuffer fängt bei 0 an...
Dankeschön!
-
Vom überprüfen von Rückgabe-Werten hältst du nicht viel, oder?
-
Badestrand schrieb:
Vom überprüfen von Rückgabe-Werten hältst du nicht viel, oder?
Danke, welche genau meinst du? len?
-
stanmc schrieb:
Badestrand schrieb:
Vom überprüfen von Rückgabe-Werten hältst du nicht viel, oder?
Danke, welche genau meinst du? len?
Den von send und den von recv. Letzterer landet zwar in len, wird aber nicht auf Fehler überprüft. Der von send wird sogar ganz ignoriert.
-
Das stimmt! Dank dir. Dann schau ich mir mal die Rückgabewerte an.
-
Und du solltest dir die Doku zu recv nochmal durchlesen. recv empfängt nicht "die ganze Antwort" sondern zwischen 1 und N bytes (oder 0 im Fehlerfall).
D.h. du brauchst einen Loop in dem du recv so oft aufrufst bis du alle Daten empfangen hast die du brauchst.EDIT: N ist die Puffergrösse die du mitgibst, also in deinem Fall CHECKBUFSIZE-1, und statt recv verwendest du read, macht aber AFAIK keinen Unterschied. /EDIT
Bei SMTP solltest du eine Schleife basteln die immer nur 1 Byte pro Durchgang abholt und abbricht wenn der "Terminator" (\r\n\r\n oder \n\r\n\r wenn ich mich richtig erinnere) empfangen wurde, da du die Länge der Antwort nicht im Voraus kennst.