3.46 DM_NetHandler

Mit Hilfe dieser Funktion kann ein NetHandler angemeldet werden. Ein NetHandler ist eine benutzerdefinierte Funktion, die der IDM unmittelbar vor dem Versenden und unmittelbar nach dem Empfangen von Netzpaketen mit dem Inhalt dieser Pakete aufruft.

Der Distributed Dialog Manager schickt alle Daten im Klartext übers Netz, das heißt, die Daten sind für jedermann lesbar. Um vertrauliche Daten vor Unbefugten zu schützen, benötigt der IDM-Anwender eine Möglichkeit, Daten die über das Netz geschickt werden, zu verschlüsseln. Diese Möglichkeit wird ihm mit der Anmeldung von NetHandlern gegeben, in denen der IDM-Anwender eine Verschlüsselung vornehmen kann.

Außer einer Verschlüsselung sind natürlich auch andere Anwendungen von NetHandlern denkbar.

void DML_default DM_EXPORT DM_NetHandler
(
  DM_NetHandlerProc NetHandler,
  DM_UInt           Operation,
  DM_Options        Options
)

Parameter

-> DM_NetHanderProc NetHandler

Funktionszeiger auf den benutzerdefinierten Handler. Der Handler muss das folgende Format aufweisen:

void DML_default DM_Callback <ProcName> (reason)
DM_NetInfo far *reason;
{
  /* Code des Anwenders */
}

-> DM_UInt Operation

Dieser Parameter kann mit folgenden Werten belegt sein:

  • DMF_RegisterHandler

    Anmelden des Handlers

  • DMF_WithdrawHandler

    Abmelden des Handlers

  • DMF_EnableHandler

    Einschalten des Handlers (noch nicht implementiert)

  • DMF_DisableHandler

    Abschalten des Handlers (noch nicht implementiert)

Nach seiner Registrierung ist ein NetHandler automatisch eingeschaltet. Es können mehrere NetHandler installiert werden, aber jeder Handler höchstens einmal.

-> DM_Options Options

Wird nicht benutzt und ist mit 0 zu initialisieren.

Bitte beachten Sie, dass solche NetHandler, die Datenpakete modifizieren, beim sendenden und empfangenden Prozess unbedingt synchron angemeldet werden müssen. Wenn der eine Prozess zum Beispiel bereits verschlüsselt sendet, der andere Prozess aber noch unverschlüsselte Daten erwartet, kann dies zum Absturz der Prozesse oder sogar des Systems führen.

Der Aufruf der angemeldeten Handler erfolgt in der umgekehrten Reihenfolge, in der sie angemeldet wurden. Es gibt dazu eine Ausnahme, die später erläutert wird.

Den NetHandlern wird beim Aufruf eine Struktur DM_NetInfo übergeben, die alle erforderlichen Informationen und die Daten des Netzpaketes enthält:

struct {
  char        *data;   /* Datenpaket */
  DM_Integer  length;  /* Datenumfang in Bytes */
  DM_Integer  action;  /* Kommunikationsvorgang */
  DM_Integer  error;   /* Fehlernummer */
  int         socket;  /* Kommunikationsschnittstelle */
  DM_ID       applID;  /* Objekt-ID der Applikation */
} DM_NetInfo;

Es gibt fünf vordefinierte Konstanten, von denen eine im Strukturelement action dem Handler mitgegeben wird:

Bei DM_NET_SEND soll das übergebene Datenpaket verschickt werden, bei DM_NET_RECEIVE wurde es empfangen. Bei diesen Vorgängen kann der Inhalt des Datenpaketes manipuliert, zum Beispiel ver- bzw. entschlüsselt, werden.

Die Konstante DM_NET_CONNECT besagt, dass gerade eine Verbindung aufgebaut wird. Dabei darf der Inhalt des Datenpakets nicht verändert werden, sonst schlägt der Verbindungsaufbau fehl.

DM_NET_CONNECTMESSAGE kennzeichnet die STDOUT-Ausgabe zum Verbindungsaufbau der mittels .exec gestarteten Anwendungsseite. Diese muss unverändert an IDM weitergeleitet werden.

DM_NET_MESSAGE kennzeichnet die STDOUT-Ausgabe der mittels .exec gestarteten Anwendungsseite. Die Ausgabe wird Zeilenweise an den NetHandler weitergegeben (Ausnahme wenn der Socket geschlossen wird). Achtung: Als erstes wird ein 0-Byte gesendet (rsh-Protokol ?) und der IDM schickt einen Zeilenumbruch vor dem Verbindungsaufbau.
Achtung: 0-Bytes bleiben als 0-Bytes erhalten. Die Länge des Strings sollte unbedingt beachtet werden.

Ist die Konstante DM_NET_RECEIVE gesetzt, werden die angemeldeten NetHandler in derselben Reihenfolge aufgerufen, in der sie angemeldet wurden. Dieser Fall bildet die oben erwähnte Ausnahme. Sie ist erforderlich, weil beim Senden vorgenommene Datenmanipulationen durch mehrere Handler beim Empfang in umgekehrter Reihenfolge wieder rückgängig gemacht werden müssen. Wird vor dem Senden beispielsweise zuerst ein protokollierender und dann ein verschlüsselnder Handler aufgerufen, müssen die Daten nach dem Empfang erst vom verschlüsselnden Handler entschlüsselt werden, bevor sie vom protokollierenden Handler aufgezeichnet werden können.

Datenmanipulationen, die bei DM_NET_SEND und DM_NET_RECEIVE vorgenommen werden, müssen invers zueinander sein, d.h. Daten, die beim Empfänger mit DM_NET_RECEIVE durch den Handler geschleust wurden, müssen identisch sein mit den Daten, die zuvor beim Sender mit DM_NET_SEND durch den Handler geschleust wurden.

Dabei ist die Menge der Datenpakete als Stream zu betrachten, denn was vom Sender als ein Paket seinem Handler übergeben wird, kommt beim Handler des Empfängers nicht unbedingt als ein Paket an. Dazwischen können die TCP/IP-Implementation oder andere Netzwerkkomponenten noch Puffer geschaltet haben. Folglich müssen eventuelle Manipulationen an den Paketinhalten unabhängig von der Position innerhalb eines Pakets sein.

Der Zeiger data auf den Inhalt des Netzpaketes darf vom Handler nicht verändert werden. Auch ein Reallokieren von data an derselben Adresse ist nicht erlaubt. Die Datenpakete können also nicht vergrößert werden, weshalb keine Dekomprimierung komprimierter Daten möglich ist.

Beispiel

/* NetHandler zum Verschluesseln von Daten
   durch Bit-Invertierung */

void DML_default DM_CALLBACK MyNetHandler
  __1((DM_NetInfo *, info)) {
  switch (info->action) {
    case DM_NET_SEND:
    case DM_NET_RECEIVE: {
      int ZaVa;
      for(ZaVa=0;ZaVa<info->length;ZaVa++)
        (info->data)[ZaVa]=~(info->data)[ZaVa];
        break;
    }
  }
}

Die Anmeldung des Handlers bei Client und Server kann zum Beispiel jeweils vor der Anbindung der C-Funktionen an den IDM geschehen:

if (!DM_NetHandler(MyNetHandler,DMF_RegisterHandler,0))
  DM_TraceMessage("NetHandler registering error", 0);