Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Socketverbindung MFC(PC)<->StandardC++ (PDA)

Empfohlene Antworten

Veröffentlicht

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.