aLeXanDer.. Geschrieben 16. Februar 2009 Teilen Geschrieben 16. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VaNaTiC Geschrieben 17. Februar 2009 Teilen Geschrieben 17. Februar 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
aLeXanDer.. Geschrieben 17. Februar 2009 Autor Teilen Geschrieben 17. Februar 2009 Heißt ich muss dem jeweiligen Clienent oder Server antworten?! Wie stell ich das dann an?! in der Methode Server SocketAccept?! Sag ich dem Server dann ja Verbinde dich mit dem Client? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VaNaTiC Geschrieben 17. Februar 2009 Teilen Geschrieben 17. Februar 2009 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 ). 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). 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.