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.

TSockerServer mit ftThreadBlocking

Empfohlene Antworten

Veröffentlicht

Hallo Community,

Borland C++ 2007

Ich hab folgendes Problem.

Ich habe ein einfaches Beispielprogramm, wo ich so ne art Chatprogramm habe.

Hab die Komponenten TSocketServer und TSocketClient integriert.

Man kan die Anwendung 2mal Starten eines davon läuft als Server

die andere dann als Client und schaltet sich auf den Server auf.

Sind beide auf der Eigenschaft

ftNonBlocked funktioniert die Kommunikation einwandfrei.

Stell ich nun aba beider auf ftBlocked, beim TSocketClient

und auf ftThreadBlocked , beim TSocketServer,

funktioniert die Kommunikation nicht. Der Client sagt zwar das er sich an den Server drangehängt hat, der Server bekommt jedoch nichts davon mit.

er läuft nicht in die Routine , OnClientConnect.

Schick ich nun Dateien vom Client zum Server, stürzt dieser ab.

Hab ich irgend eine Kleinigkeit übersehn?! oder gibt es was bestimmtes zu beachten das beide als Blocked laufen!?

Zum Test hab ich Texte verschickt.

vom Server zum Client mit

ServerSocker->Socket-Connection(0)->SendText
und vom Client zum Server mit
ClientSocket->Socket->SendText

Hab keine Idee mehr an was es liegen könnte.

Danke

alex

hmm, so einfach ist das aber nun nicht umzuschalten zwischen synchroner (blocked) und asynchronen (non-blocking) Implementierung.

Grob gesagt wird bei asynchroner Socket-Programmierung eine Funktion wie connect() aufgerufen und dieser Aufruf kehrt nach dem eigentlichen Handling sofort an den aufrufenden Kontext zurück. Deshalb wird bei asynchronen Sockets immer in Ereignissen reagiert, wie OnError(), OnRead() und wie sie alle heißen mögen.

Bei synchronen Sockets ist das anders, da wartet der Aufruf von connect() bis alles erledigt ist, also bis Std-Timeout oder bis Server geantwortet hat.

Wenn dann aber nach connect() kein Code mehr folgt, wird logischerweise der Code im OnConnected() nicht ausgeführt, also gehts nicht weiter.

Hmm, das ist nicht so einfach zu beantworten, was man wann machen muss.

Das hängt in allererster Linie davon ab ob blocking oder non-blocking.

Danach kommt es darauf an, ob Du den Client und/oder Server machen willst.

Im Prinzip läuft es aber immer auf dasselbe raus:

Server S bindet sich an IP:Port, meist 0.0.0.0:Port

S wartet (listen) auf Connects der Clients, hier bereits Unterschied zwischen blocking und non-blocking.

Blocking wartet in einem Thread. Non-Blocking returnt intern immer und liefert einfach kein Eregnis

Client C connectet sich an IP:Port (aber nicht 0.0.0.0, sondern eine echte :D ).

blocking C wartet auf Timeout oder Erfolg.

non-blocking C returnt nach Verbindungsversuch sofort und läuft einfach weiter. D.h. asynchroner C registriert eine Callback OnConnected() oder so und dort wird gehandelt, dass Connect ok ist.

Leider kann ich Dir ohne konkrete Aufgabenstellung, was Du am non-blocking Beispielprogramm verändern willst, nicht genauer helfen.

Unter "Accept" versteht man genau das Handling, wenn der Server dem Client den vom Client initiierten Verbindungsversuch statt gibt. D.h. zum Zeitpunkt, wenn der Server noch kein Accept gemacht hat, kann der Server auch die halb-offene Verbindung schliessen und der Client geht leer aus (Stichwort: Accept-Floodings).

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.