SwordMaster Geschrieben 23. Dezember 2009 Teilen Geschrieben 23. Dezember 2009 Hallo Zusammen, ich habe auf meinem PC ein MFC Serverprogramm am laufen wo ich die Klassen CAsyncSocket verwende. und ein GTK C++ Programm welches als Client auf meinem PDA läuft. Beim Client verwende ich Standard C++ Befehle. connect, read, write Beim Client stelle ich die Verbindung folgendermaßen her: int laenge; unsigned short int portnummer = 7676; char ip_adresse[] = "192.168.178.24"; struct sockaddr_in adresse; socket_nummer = socket(AF_INET, SOCK_STREAM, 0); adresse.sin_family = AF_INET; adresse.sin_addr.s_addr = inet_addr(ip_adresse); adresse.sin_port = htons(portnummer); laenge = sizeof(adresse); server_socket = connect(socket_nummer, (struct sockaddr *)&adresse, laenge); Um einen String vom Server zu Empfangen verwende ich: read(socket_nummer,empfangene_files,sizeof(empfangene_files)); das ganze funktioniert auch ganz prima, das problem ist nur dass wenn ich vom MFC Server zweimal hintereinander ein SEND absetze das am PDA als "ein einziger string" ankommt? Kann ich beim CAsyncSocket.Send irgendein "ENDEZEICHEN" mitgeben? Damit der PDA es checkt das ich zweimal was geschickt hab? Aktuell hab ich nach jedem Send ein Sleep eingebaut. aber das macht das Programm unnötig langsam Viele Grüße Stefan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 23. Dezember 2009 Teilen Geschrieben 23. Dezember 2009 das ganze funktioniert auch ganz prima, das problem ist nur dass wenn ich vom MFC Server zweimal hintereinander ein SEND absetze das am PDA als "ein einziger string" ankommt?Das ist kein Problem, sondern ein völlig normales Verhalten. Du hast einen Stream-Socket erstellt (SOCK_STREAM), also hast du einen Strom von Bytes zwischen den Endpunkten. Es gibt da keine Markierungen, wo ein send-Aufruf endete und der nächste anfing. Diese Information wird einfach nicht übermittelt. Es kann übrigens auch passieren, dass dir ein recv-Aufruf weniger Daten liefert, als beim send abgeschickt wurden, und du dir die Daten mit wiederholten recv-Aufrufen zusammenstückeln musst, bis du alles hast, was du brauchst. Kann ich beim CAsyncSocket.Send irgendein "ENDEZEICHEN" mitgeben? Damit der PDA es checkt das ich zweimal was geschickt hab?Wenn der das Empfänger nicht anhand der empfangenen Bytes erkennen kann (feste Größe der Nachricht?), dann musst du so etwas wohl tun. Denk dir ein "Endezeichen" aus, das sonst so in deinem Datenstrom nicht vorkommen kann. Was gesendet wird, hast du doch selbst in der Hand. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.