Socket Problem

ElchiMtr

Grünschnabel
Hallo Freunde,

ich bin neu hier, aber habe schon ein Problem.
Ich schreibe gerade ein Programm, welches daten über einen Socket senden und emfangen soll. Ich habe nur den client der Server ist fix.
Nun das eigentliche Problem, immer wenn ich mit send(socket_id, puffer, anz) etwas verschicke und dann später per read etwas empfange, empfange ich immer 7 byte pro zeichen das ich zuvor gesendet habe.

Ist soetwas bekannt ? wenn ja was mache ich dabei falsch ?

Vielen dank für eure Hilfe.

gruß ElchiMtr

edit: ich arbeite auf einem Fedorra mit einem gcc version 4,1,2
 
Zuletzt bearbeitet:
Hi

du bekommst also falsche Daten.
a) Server falsch. Ohne mehr Infos kann man dazu gar nichts sagen
b) Dein Code falsch. Ohne mehr Infos auch hier nichts machbar. Am besten den betroffenen Code.

Einen derartigen Bug von libc etc. aus schließ ich mal aus.
 
Ja du hast recht, ist wirklich etwas kurz.

Also der "sever" ist in diesem Fall ein RS232 zu LAN -Wandler. Verbinde ich mich via Telnet mit dem Gerät emfängt es nach dem senden keine weiteren Zeichen. Also am Server liegt es denke ich nicht. Da dieser mit telnet ja geht.

das soket erstellen und öffnen funktioiert prima ist auch aus einem anderen Programm übernonnem.

C++:
char buf[1024];
char *tm = "7012";
int w,s;
w = write(sd, tm, sizeof(tm)); //1
printf("%d %s",w, buf); 
r = read(sd, buf, sizeof(buf)); //2
printf("%d %s",r, buf); 
r = read(sd, buf, sizeof(buf)); //3
printf("%d %s",r, buf);

was passiert ist :
es werden die 4 byte "7012" gesendet wird auch so bei 1 angezeigt.
dann werden bei 2 20byte empfangen (alle zeichen kleiner ASCII 32).
und bei 3 wartet das Programm darauf Daten vom Server zu empfangen.
Ab hier klappt es auch prima bis zum nächsten senden.

ich bin ratlos, als würde das senden über den emfang der 20 bestätigt. die Kette "7012" kommt aber an.

wer hat ne idee ?
 
Zuletzt bearbeitet:
Hallo ElchiMtr und willkommen im Forum,

ich glaube so ganz verstehe ich noch nicht, was genau bei dir schief läuft. Was mir aber schonmal aufgefallen ist, ist, dass dein "write" Aufruf nicht ganz passt. sizeof(tm) würde dir hier die Größe des Pointers tm zurück geben, was auf einem 32 bit System 4 Byte sind, das ist richtig. Du willst ja aber, denke ich mal, den String in "tm" verschicken. Dieser ist aber die Anzahl der Zeichen multipliziert mit der Anzahl der Bytes pro Zeichen groß.

Das Empfangen sieht soweit ganz ok aus, ich würde aber vielleicht den buffer "buf" jedesmal vor einem neuen "read" Aufruf neu initialisieren um ihn von vorher empfangenen Daten zu reinigen. Also zum Beispiel mit

C++:
memset(buf, 0, sizeof(buf));



Gruß,
Wolf
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

über das Puffer leeren hab ich hier mal noch keine weiteren schritte geplant. Auch das Senden mit der falschen Größe ist kein Problem, da ich ja mit 4 byte getestet habe, aber das passe ich noch an.

ich habe mein Programm auch extra auf so eine Minimallösung gekürzt um den Fehler zu finden.
Um es noch mal einfach zusagen, wenn ich nur read(...) ausführe klappt alles wie gewünscht.
Aber habe ich was gesendet mit write(...), bekomme ich selbst beim nächsten read zunächst selsame zeichen und dann kommt das was eigentlich gesendet wurde.

diese zusätzlichen Zeichen wurden, aber vom Server nicht gesendet.
 
Warum bist du dir da so sicher?

Schau dir evt. mit einem Sniffer den Datenverkehr am PC an (zB. Wireshark)
Wenn man die Problembytes dort auch sieht liegt es nicht an deinem Programm

habe ich gerade mal gemacht, der wireshark die Auswertung brachte keine neuen Erkenntnisse.

Aber müsste ich die Problembytes, so sie denn vom Server kommen nicht auch bekommen, wenn ich eine Telnetverbindung habe ?
 
Ich kann mir eigentlich auch nicht vorstellen, dass das Problem an der Client Seite liegt. Der Code den du gepostet hast dürfte nicht für komische Zeichen im Buffer verantwortlich sein. Eher liegt das Problem an dem RS232 zu LAN Wandler.
 
@Telnet: Du schreibst ja, dass die Problembytes alle <32 sind.
Telnetprogramme sind auf lesbaren Text ausgelegt.
Vielleicht werden die Zeichen bei deinem einfach nicht angezeigt.
 
Hallo,
habe das Problem nur überflogen, aber aus Erfahrung weiß ich, dass Probleme entstehen, wenn kein String-Ende-Zeichen empfangen wird. Versuch mal einen 0 terminierten String zu übertragen also 5Bytes. Ansonsten wie sheel sagte mit Wireshark arbeiten, weil dann hast du die genauen Zeichenketten.

Grüße
 
Zurück