Sichere Kommunikation mit einem Thread



  • Ich habe einen sehr speziellen Fall bei dem ich etwas ins Schleudern komme. Ich programmiere grade für ein externes Programm ein plugin, welches als Dll geladen wird. Mein Plugin ist letztendlich nichts weiter als ein Socket-Server, der genau eine Verbindung annehmen und mit dieser kommunizieren muß.
    Das externe Programm (ein physikalischer Simulator) wird über eine Skriptsprache gesteuert, durch die auch die dll geladen wird. Das Plugin wiederum kann Funktionen der umgebenden Skriptdatei (auch eigen definierte) aufrufen. Es soll nun funktionieren, dass ein Programm eine Verbindung zu meinem server-Plugin aufnimmt, ihm eine Nachrichte sendet und unbestimmte Zeit später von der Skriptsprache (also meinem Skriptsprachenprogramm) eine Antowort gesendet wird. In etwas so:

    Simulator: Skript -> lade und starte Server.dll
               Skript -> Server.dll -> baue connection auf
               Skript -> Server.dll -> warte auf Nachricht
               ...
               Skript -> Server.dll -> sende Antwort
    

    Leider sorgt jder blockierende Aufruf des Servers dafür, dass die GUI des Simulators komplett aussetzt, sie läuft anscheinend nicht in einem eigenen Thread. Also habe ich den Server in einem eigenen Thread gestartet über _beginthread(...). Das hat natürlich den Nachteil, dass ich von der Skriptsprache keine synchronen Aufrufe mehr an den server machen kann, da ich z.B. ein read() aufrufen kann, bevor überhaupt jemand verbunden ist.

    Wie kann ich dieses Problem meistern?



  • benutze nonblocking sockets und dazu select, poll und konsorten.



  • Serethos schrieb:

    Das hat natürlich den Nachteil, dass ich von der Skriptsprache keine synchronen Aufrufe mehr an den server machen kann, da ich z.B. ein read() aufrufen kann, bevor überhaupt jemand verbunden ist.

    mach z.b. eine zweite read-funktion, die einen statuswert zurückgibt.
    etwaso:
    -1 --> verbindung geschlossen
    -2 --> verbindung wird gerade aufgebaut
    0 --> verbindung steht, aber nix empfangen
    jeder positive wert --> x bytes empfangen



  • Ich habe leider noch einige Verständnisprobleme. Das Hauptprogramm (der Simulator) lädt das Plugin, welches auf Nachrichten horchen soll. Das ginge ja auf zwei Weisen: Entweder, nur das Starten des Servers geschieht in einem eigenen Thread und das Hauptprogramm macht direkte aufrufe auf die serverRead()-Funktion. Das würde doch aber bedeuten, dass wieder das Hauptprogramm den blockierenden Aufruf machen würde (richtig?). Also nix gewonnen.
    Oder der Server wird in einem eigenen Thread gestartet und horcht dann automatisch endlos an der Leitung und benachrichtigt über ein event-System das Hauptprogramm. Aber wie kann ich in diesem Fall den Server vom Hauptprogramm aus herunterfahren?
    Denn was passiert, wenn grade der Server-Thread auf dem socket horcht und das Hauptprogramm versucht, diesen socket zu schließen?
    Einfach den Thread von außen abzuschießen kann ja auch nicht ide Lösung sein..



  • Serethos schrieb:

    Denn was passiert, wenn grade der Server-Thread auf dem socket horcht und das Hauptprogramm versucht, diesen socket zu schließen?
    Einfach den Thread von außen abzuschießen kann ja auch nicht ide Lösung sein..

    der severthread bekommt mit, dass der socket wech ist und kommt aus recv/send mit 'nem fehlerstatus raus. dann kannste den grund abfragen (z.b. socket nicht mehr vorhanden) und dann kann sich der thread selber beenden...



  • Danke für die Antworten!


Anmelden zum Antworten