Netzwerkprobleme: Wieviele Bytes kommen?
-
Ich schreibe seit kurzem an einem FTP-Client. Bei manchen Servern funktioniert er, bei anderen nicht. Ich habe inzwischen herausgefunden, dass die Willkommensnachricht des Severs daran Schuld ist. Einige Server senden diese "in einem Rutsch", also mit einem send(), während andere die Nachricht auf mehrere sends() aufsplitten. Damit schieben die mir die Arbeit in die Schuhe. Woher soll ich vorher wissen, wie oft ich recv() aufrufen muss. Gibt es da nicht so ne Art Schleife die man konstruieren könnte (à la while(noch_was_zu_empfangen){ })?
-
recv() gibt die Anzahl der empfangenen Bytes zurueck. Dementsprechend kannst Du solange recv() aufrufen, bis die Wilkommensnachricht komplett gesendet und empfangen wurde.
-
Das ist mir schon klar, aber die Willkommensnachricht kann verschieden lang sein. Manchmal sagt der Server einfach nur "220 Service ready" mit einem send(), manchmal sind es zwei oder drei aufrufe von send(), die der Server ausführt bis ich die komplette Nachricht habe. Ich muss also vorher wissen, wie lang die Willkommensnachricht ist, was unmöglich ist. Also muss ich irgendwie bei recv() tricksen.
-
Original erstellt von hackbert:
Das ist mir schon klar, aber die Willkommensnachricht kann verschieden lang sein. Manchmal sagt der Server einfach nur "220 Service ready" mit einem send(), manchmal sind es zwei oder drei aufrufe von send(), die der Server ausführt bis ich die komplette Nachricht habe. Ich muss also vorher wissen, wie lang die Willkommensnachricht ist, was unmöglich ist. Also muss ich irgendwie bei recv() tricksen.Der Server sagt garantiert nur ein send(). Trotzdem stellen Sockets nicht sicher, dass ein send() auch in einem recv() ankommt, nur dass die Daten in der richtigen Reihenfolge bei sukzessivem aufrufen von recv() ankommen. Du kannst aber solange recv() aufrufen, bis du vom Server das \r\n bzw. CRLF bekommen hast, welches die Wilkommensnachricht abschließt. Ebenso für alle weiteren Servernachrichten.
-
Daran habe ich auch schon gedacht, das dürfte allerdings nicht funktionieren. Alle empfangenen Nachrichten gehen in eine Editbox rein. Die braucht \r\n für eine neue Zeile. Manchmal kommen innerhalb eines recv() anscheinend auch mehrere \r\n vor, da bei einem einzigen recv() Aufruf mehrere Zeilen auf einmal in die Editbox eigefügt werden.
Wenn ich folgende Schleife baue kommt auch nur Mist raus:while(!strstr(Buffer, "\r\n")) { i = recv(s, Buffer, sizeof(Buffer), 0); Buffer[i] = 0; InsertMessageLog(g_log, Buffer); }
[ Dieser Beitrag wurde am 01.06.2003 um 14:30 Uhr von hackbert editiert. ]