Socket Problem Zeichen verschwinden

DaFunk2k

Mitglied
Hallo,

ich habe ein sehr merkwürdiges Problem bei der Socketprogrammierung. Wollte mal hören, ob vielleicht einer von euch auch schon einmal so ein Problem hatte.

Scheinbar werden nicht alle Zeichen die vom Server gesendet werden.

Ein Beispiel:

Wenn ich an den Server das Kommando help übertrage wird folgendes an den Client gesendet:
C++:
conn.send("\n");
conn.send(" --- Universal File Transfer Tool (UFTT) ---\n");
conn.send(" --- - - - - - - - - - - - - - - - - - - ---\n");
conn.send(" --- List of available commands:         ---\n");
conn.send(" --- list - list specified directory     ---\n");
conn.send(" --- shdw - shutdown server              ---\n");
conn.send(" ---                                     ---\n");
conn.send(" ---                                     ---\n");
conn.send(" --- help - show this screen ;)          ---\n");
conn.send(" --- - - - - - - - - - - - - - - - - - - ---\n");
conn.sendEndSequence();

der Befehl send sieht so aus:
C++:
int CTCP::send(char *string)	{
	this->rc = ::send(this->sockConnected, string, strlen(string)+1, NULL);
	return rc;
}

Die Daten werden wie gesagt auch richtig übertragen. Mein Client wartet solange auf Daten bis er eine bestimmte Zeichenkette empfängt (deshalb am Ende .sendEndSequence). Bei meinem Client kommen die Daten aber nur so an:
Code:
 --- Universal File Transfer Tool (UFTT) ---
 ---             for EDAS                ---
 --- - - - - - - - - - - - - - - - - - - ---
-- List of available commands:         ---
 --- list - list specified directory     ---
 --- shdw - shutdown server              ---
 ---                                     ---
 ---                                     ---
-- help - show this screen ;)          ---
 --- - - - - - - - - - - - - - - - - - - ---

Ab und zu wird also das führende - verschluckt. Dies ist aber meistens jedes mal ein anderes. Mit Hilfe von Ethereal habe ich jetzt herausgefunden, dass dies immer dann passiert, wenn zwei Reihen direkt in einem TCP Packet versendet werden:

Die Nutzdaten fangen jeweils ab 0036 an.

Dies ist eine richtige Übertragung:
Code:
0000   00 11 6b 36 31 c2 00 c0 52 00 66 25 08 00 45 00  ..k61...R.f%..E.
0010   00 56 65 e9 40 00 80 06 11 59 c0 a8 01 0a c0 a8  .Ve.@....Y......
0020   01 05 15 be 0b 66 05 c4 41 c0 93 a4 3e 21 50 18  .....f..A...>!P.
0030   7f d7 b7 fd 00 00 20 2d 2d 2d 20 55 6e 69 76 65  ...... --- Unive
0040   72 73 61 6c 20 46 69 6c 65 20 54 72 61 6e 73 66  rsal File Transf
0050   65 72 20 54 6f 6f 6c 20 28 55 46 54 54 29 20 2d  er Tool (UFTT) -
0060   2d 2d 0a 00                                      --..

Dies ist eine falsche Übertragung:
Code:
0000   00 11 6b 36 31 c2 00 c0 52 00 66 25 08 00 45 00  ..k61...R.f%..E.
0010   00 84 6b e9 40 00 80 06 0b 2b c0 a8 01 0a c0 a8  ..k.@....+......
0020   01 05 15 be 0b 66 05 c4 42 4a 93 a4 3e 21 50 18  .....f..BJ..>!P.
0030   7f d7 ab d8 00 00 20 2d 2d 2d 20 4c 69 73 74 20  ...... --- List 
0040   6f 66 20 61 76 61 69 6c 61 62 6c 65 20 63 6f 6d  of available com
0050   6d 61 6e 64 73 3a 20 20 20 20 20 20 20 20 20 2d  mands:         -
0060   2d 2d 0a 00 20 2d 2d 2d 20 6c 69 73 74 20 2d 20  --.. --- list - 
0070   6c 69 73 74 20 73 70 65 63 69 66 69 65 64 20 64  list specified d
0080   69 72 65 63 74 6f 72 79 20 20 20 20 20 2d 2d 2d  irectory     ---
0090   0a 00                                            ..

Im letzten sieht man, dass zwei Zeilen in einem Packet übertragen wurden.
In meinem Clientprogramm wird dann das Leerzeichen und der erste - vor list abgeschnitten.

Wäre für jeden Tipp dankbar wie man dieses Problem beseitigen könnte.

Vielen Dank
Andreas
 
Zuletzt bearbeitet von einem Moderator:
Du musst die Länge deiner übertragenen Daten schon wissen.
Strlen sucht nach \n und das ist für eine Socket-Übertragung nicht funktional.
Also keinen String sondern char* und einen int als Länge benutzen.

ps: dasselbe Problem hatte ich aber auch beim ersten Mal Programmieren mit Sockets.
 
Thomas Kuse hat gesagt.:
Strlen sucht nach \n und das ist für eine Socket-Übertragung nicht funktional.

Ein string ist definiert als Zeichenkette die mit 0 endet. Und eben diese 0 sucht strlen, nicht das \n...
 
ich benutze doch char*
Und da schien mir bislang das Beste zu sein mit strlen zu arbeiten. Wüsste nicht wie ich die Länge zur Laufzeit anderweitig ermitteln sollte.
 
Hi.

Die Übertragung sieht eigentlich doch gut aus. Wie liest du denn im Client die Daten wieder ein, wie sieht deine receive Funktion aus?

Probier doch mal das \0 Zeichen nicht zu übertragen.

Gruß
 
Vielen Dank deepthroat....das war die Lösung:

Hier nochmal die Änderung nach der es funktioniert hat:

C++:
int CTCP::send(char *string)	{
	this->rc = ::send(this->sockConnected, string, strlen(string), NULL);
	return rc;
}

Die schwierigsten Probleme haben oft die simpelsten Lösungen :)
 
Zurück