recvLine() Funktion ...
-
Ich würde gerne von eimen socket immer eine zeile (\n <- terminiert das einlesen) eingelesen wird.
So far sieht das bei mir so aus:std::string rcvLine(SOCKET proxySock) { int bytesReceived; char buf; std::string line = NULL; bool moreData = true; while(moreData) { bytesReceived = recv(proxySock, &buf, 1, 0); if(bytesReceived <= 0) { moreData = false; } else { if(buf == '\n') { line += '\0'; return line; } else { line += buf; } } } }
Leider bekomme ich beim ausführen meines Programms einen Abnormal Programmtermination error ... Ich bin mir relativ sicher, dass es an dieser Funtktion liegt. Was hab ich da versaut?
MfG
John
-
das alleine crasht schon:
std::string line = NULL;
und ich würde char buf[2] nehmen und den buffer 0 terminieren bevor du ihn zum string addest. kann auch sein das es buf[3] lauten muss.
-
Joa stimmt, das mit dem NULL hab' ich auch gerade festgestellt :p
Ansonsten läuft es glaube ichbekomme zwar immer noch nen error, aber ich weiß, woran das liegt. Ist ein anderes Ding ...
-
du liest immer in 1byte schritten? Wow, dass dürfte langsam sein. Und std::string wird übrigens nicht 0-terminiert, was wohl auch dein Fehler ist.
-
Das cleverste ist IMHO, eine separate Pufferungsschicht einzuführen. Ähnlich den iostreams. Du liest deine Zeile dann aus dem Puffer. Wenn der Puffer leer ist, wird der nächste Block vom Socket geholt usw. hoffe das war verständlich, wenn nicht, meditier mal über der Funktionsweise von iostreams
-
Bashar schrieb:
Das cleverste ist IMHO, eine separate Pufferungsschicht einzuführen. Ähnlich den iostreams. Du liest deine Zeile dann aus dem Puffer. Wenn der Puffer leer ist, wird der nächste Block vom Socket geholt usw. hoffe das war verständlich, wenn nicht, meditier mal über der Funktionsweise von iostreams
folgendes sollte dir dabei helfen
http://www.cplusplus.com/ref/iostream/
http://www.langer.camelot.de/IOStreams/Excerpt/excerpt.htm#Main(achja, du könntest sogar die iostreams dann nutzen, wenn du einfach einen streambuf für Sockets implementierst. Google mal ein wenig, gibt mehrere C++ Socket Librarys, die das so machen)
-
Shade hat entsprechendes mal Implementiert. Ich weiss allerdings nicht, ob er
das ins Internet gestellt hat.Kannst ja mal anfragen.
mfg
v R
-
virtuell Realisticer schrieb:
Shade hat entsprechendes mal Implementiert. Ich weiss allerdings nicht, ob er
das ins Internet gestellt hat.Ja, aber da ich die Lust verloren habe, ist es nicht fertig - aber aus Ausgangsbasis für eine Socketlib ist der Code sicher brauchbar.
-
Was eventuell auch noch geht ist der MSG_PEEK Parameter bei recv.