BitCtrl Systems GmbH
Foto Weissenfelserstr. 67
Suche:     
 BitCtrl Systems GmbH
Produkte Support News & Events Download Shop Partner Kontakt
  Beschreibung
  Installation und Schnellstart
  QNX® 4 Installation
  QNX® 6 Installation
  Beispiele zur
  Programmentwicklung
  Dienstprogramme
  Programmreferenz
  QoIP Überblick
  Kommunikation und
  Netzwerk
  Software für QNX RTOS

QNX® IPC over IP

Dokumentation

BeschreibungZurück zum Seitenanfang
Was macht QoIP ?
 

QoIP ermöglicht die transparente QNX® Interprocess Communication (QNX® 4 IPC) mit Send-Receive-Reply und mit Proxy zwischen QNX® 4 Prozessen auf Basis von IP-Verbindungen (Internet Protocol).

QoIP 44s

QoIP ermöglicht die Anwendung der QNX® 4 Interprocess Communication auch auf dem OS QNX® 6.

QoIP 46m

QoIP ermöglicht die transparente QNX® 4 Interprocess Communication (IPC) zwischen Prozeßen unter QNX® 4 - QNX® 6 - Linux in beliebiger Richtung und Kombination. Bei Linux werden die Send-Receive-Reply-Module aus dem "SIMPL" Project benötigt, siehe http://www.holoweb.net/~simpl/.

QoIP 46s
Wie steht es mit Proxy / Event Triggering ?
 

Ist implementiert und funktioniert auch.

Was macht QoIP nicht ?
 

QoIP ist kein INFLEET !! QoIP verbindet einzelne Prozeße verschiedener OS und Rechner über das Internet, - es verbindet keine Netze!

Wie funktioniert QoIP ?
 

QoIP arbeitet ähnlich wie QNX® 4 VC (Virtual Circuits), aber über tcp/ip. Pro Verbindung (qoip_name_locate) wird auf beiden Seiten je 1 tcp/ip Channel und für Proxy / Event Kommunikation 1 Reverse tcp/ip Channel geöffnet.

Für die QoIP-Kommunikation ist auf der Serverseite der IP-daemon qoipd zu installieren, der den QoiP Strom von einem definierten Port der IP-Verbindung liest bzw. schreibt und an die Anwendung des Nutzers weiterleitet. Auf der Seite des Clients ist der Proxy-Prozeß qoipp zu starten, welcher die Vertretung für die Anfragen der Anwendung aus der eingelinkten QoIP Library entgegennimmt und über die IP-Verbindung dem Server zuleitet.

Der Umfang der Libraries umfasst lediglich fünf Funktionen, so dass eine Anpassung bestehender verteilter QNX® 4 Anwendungen auf die Internet-Kommunikation ohne großen Aufwand möglich wird. Die Hauptlast der Kommunikation wird vom QoIP-Proxy-Prozeß und vom QoIP-Daemon geleistet.

Die nachfolgenden Beispiele zeigen, dass die Handhabung der QoIP-Funktionen sehr ähnlich der üblichen Verwendung der Funktionen des QNX® 4 IPC ist.

Schematische Darstellung
API
 

Für die Programmentwicklung des Clients werden folgende Libraries benötigt:

  • qoip3r.lib für QNX® 4,
  • libqiop.a für QNX® 6 x86,
  • libqiop.a für Linux x86
  • Eine zusätzliche Socket Library ist nicht notwendig.
  • Für den QoIP-Server wird keine API-Library benötigt, sondern im Anwenderprogramm ist die Verwendung des Headers qoiplib.h - qiop_event_t Definition gefordert, siehe unten.

    Einschränkungen
     
  • Die Größe der Messages ist z.Z wie bei QNX® 4 auf 64KByte begrenzt. Es werden dabei aber nicht zwangsläufig 64Kbyte Pakete durch tcp/ip übertragen.
  • Es wird zwar nur ein QoIP Provider (Daemon) für mehrere Verbindungen zwischen den Prozeßen verwendet. Der Deamon kann jedoch nur Prozeße auf lokalem Knoten bedienen.
  • Installation und SchnellstartZurück zum Seitenanfang
    QNX® 4 Installation
     
    1. Download des Pakets qoip.v1.0.qnx4.tar.gz
    2. Login als 'root'
      # cd /
      # /etc/install -u qoip.v1.0.qnx4.tar.gz
    3. Lizens aus Datei
      /usr/local/bitctrl/qoip/v1.0/etc/licenses/.licenses
      zu Datei /.licenses hinzufügen
    4. Lizenzinformation aktualisieren
      # license -r
    5. QoIp Daemon und / oder Proxy starten (paketabhängig)
      # /usr/local/bin/qoipp
      # /usr/local/bin/qoipd
    6. make Beispiele
      $ cd /usr/local/bitctrl/qoip/v1.0/src
      $ cd server
      $ make clean
      $ make
      $ ./server &
      $ cd ../client
      $ make clean
      $ make
      $ ./client localhost
    7. wenn QoIP installiert ist, Versuch zu starten
      $ ./client <hostname>
    Relevante QNX® 4 Dateien und Verzeichnisse des QoIP Software-Pakets
     
    /usr/local/bitctrl/qoip/v1.0/
    /---------------------------+
    |
    +-bin binäre Dateien
    |   |qoipp QoIP Proxy
    |   |qoipd QoIP Daemon
    |
    |
    +---lib Bibliothek(en)
    |   \qoip3r.lib QoIp Bibliothek
    |
    +---inc Include Dateien
    |   \qoip.h QoIP Header Datei
    |
    +---src Beispiel Quelldateien
    |     |
    |     +---server
    |     |   |server.cc Server Beispiel
    |     |   \Makefile makefile für Server
    |     |
    |     +---client
    |     |   |client.cc Client Beispiel
    |     |   \Makefile makefile für Client
    |     |
    |     +---include
    |         \my.h Gemeinsame Header Datei für Server und Client
    |
    +---etc etc
    |     |
    |     +---licenses
    |     |   \.licenses Lizenzdatei
    |     |
    |     +---version
    |     |   \qoip Versionsdatei
    |     |
    |     +---readme
    |         \qoip Hilfedatei
    \

    Relevante QNX® 4 Links des QoIP Software-Pakets
     

    /usr/local/bitctrl/qoip/v1.0/bin/qoipp -> /usr/local/bin/qoipp
    /usr/local/bitctrl/qoip/v1.0/bin/qoipd -> /usr/local/bin/qoipd
    /usr/local/bitctrl/qoip/v1.0/lib/qoip3r.lib -> /usr/local/lib/qoip3r.lib
    /usr/local/bitctrl/qoip/v1.0/include/qoip.h -> /usr/local/include/qoip.h
    /usr/local/bitctrl/qoip/v1.0/etc/readme/qoip -> /etc/readme/qoip
    /usr/local/bitctrl/qoip/v1.0/etc/version/qoip -> /etc/version/qoip

    QNX® 6 Installation
     
    1. Download des Pakets qoip-1.0-nto-x86.tgz
    2. Paket entpacken und in folgendes Verzeichnis wechseln
      $ tar -zxvf qoip-1.0-nto-x86.tgz
      $ cd qoip/v1.0
    3. zu Nutzer 'root' wechseln und Setup-Skript starten
      $ su root
      # ./setup
      # exit
      $
    4. QoIp Daemon und / oder Proxy starten (paketabhängig)
      $ /usr/local/bin/qoipp
      $ /usr/local/bin/qoipd
    5. Lizenzinformation aktualisieren
      # license -r
    6. make Beispiele
      $ cd src
      $ cd server
      $ make clean
      $ make
      $ ./server &
      $ cd ../client
      $ make clean
      $ make
      $ ./client localhost
    7. wenn QoIP installiert ist, Versuch zu starten
      $ ./client <hostname>
    Relevante QNX® 6 Dateien und Verzeichnisse des QoIP Software- Pakets
     

    qoip/v1.0/
    /--------+
    |
    +-bin binäre Dateien
    |   |qoipp QoIP Proxy
    |   |qoipd QoIP Daemon
    |
    |
    +---lib Bibliothek(en)
    |   \libqoip.a QoIp Bibliothek
    |
    +---inc Include Dateien
    |   \qoip.h QoIP Header Datei
    |
    +---src Beispiel Quelldateien
    |     |
    |     +---server
    |     |   |server.cc Beispiel Server
    |     |   \Makefile makefile für Server
    |     |
    |     +---client
    |     |   |client.cc Beispiel Client
    |     |   \Makefile makefile für Client
    |     |
    |     +---include
    |         \my.h Gemeinsame Header Datei für Server und Client
    |
    +---etc etc
    |     |
    |     +---licenses
    |     |   \.licenses Lizenzdatei
    |     |
    |     +---version
    |     |   \qoip Versionsdatei
    |     |
    |     +---readme
    |         \qoip Hilfedatei
    \

    Relevante QNX® 6 Links des QoIP Software-Pakets
     

    /usr/local/bitctrl/qoip/v1.0/bin/qoipp -> /usr/local/bin/qoipp
    /usr/local/bitctrl/qoip/v1.0/bin/qoipd -> /usr/local/bin/qoipd
    /usr/local/bitctrl/qoip/v1.0/lib/libqoip.a -> /usr/local/lib/libqoip.a
    /usr/local/bitctrl/qoip/v1.0/include/qoip.h -> /usr/local/include/qoip.h

    Beispiele zur ProgrammentwicklungZurück zum Seitenanfang
    Übliches Beispiel der QNX® 4-QNX® 4 Kommunikation ohne QoIP
     

    Server und Client befinden sich im gleichen QNX® 4- Netzwerk.
    Die Programmierung geschieht normalerweise wie folgt:

      Server:
     

    Id = qnx_name_attach( 0, "bitctrl/common/test" );
    pid = Receive( 0, &msg, sizeof( msg ) );
    printf( "Received a message from %d.\n", pid );
    Reply( pid, &msg, sizeof( msg ) );
    qnx_name_detach(id);

      Client:
     

    pid = qnx_name_locate(0, "bitctrl/common/test", 0, 0);
    Send (pid, &msg, &msg, sizof(msg), sizeof(msg));

    Beispiel QNX® 4-QNX® 4 Kommunikation mit QoIP
     

    Server in Honolulu (QNX® 4), Client in Leipzig bei BitCtrl (QNX® 4):

      Server:
     

    Id = qnx_name_attach( 0, "bitctrl/qoip/test" );
    pid = Receive( 0, &msg, sizeof( msg ) );
    printf( "Received a message from %d.\n", pid );
    Reply( pid, &msg, sizeof( msg ) );
    qnx_name_detach(id);

      Client:
     

    Pid = qoip_name_locate("bitctrl.honolulu.hi.us", "bitctrl/qoip/test", 0);
    Send (pid, &msg, &msg, sizof(msg), sizeof(msg));

    Beispiel QNX® 4-QNX® 6 Kommunikation mit QoIP
     

    Server in Honolulu (QNX® 4), Client in Leipzig bei BitCtrl (QNX® 6):

      Server QNX® 4 (wie immer):
     

    Id = qnx_name_attach( 0, "bitctrl/qoip/test" );
    pid = Receive( 0, &msg, sizeof( msg ) );
    printf( "Received a message from %d.\n", pid );
    Reply( pid, &msg, sizeof( msg ) );
    qnx_name_detach(id);

      Client QNX® 6:
     

    pid = qoip_name_locate("bitctrl.honolulu.hi.us", "bitctrl/qoip/test", 0);
    MsgSend(pid, &msg, sizof(msg), &msg, sizeof(msg));

    Beispiel QNX® 6-Linux (Proxy / Event mit QoIP)
     

    Server in Leipzig (QNX® 6), Client in Berlin (Linux):

      Server QNX® 6:
     

    if ((attach = name_attach(NULL, "bitctrl/qoip/test", 0)) == NULL) {
       return EXIT_FAILURE;
    }
    while (1) {
       rcvid = MsgReceive(attach->chid, &msg, sizeof(msg), NULL);
       ...
       if (msg.type == MSG_GIVE_EVENT){
          MsgDeliverEvent(rcvid, (struct sigevent*) &msg.event );
       }
    }

      Client Linux (SRR-Module from SIMPL-Projekt):
     

    #include <srr.h>
    #include <qoip.h>
    pid_t pid, rcvid, proxy;
    qoip_event_t event;     /* qoip.h:
                             typedef union {
                             pid_t proxy;
                             __sigevent_t event;
                             } qoip_event_t;
                             */

    proxy = qnx_proxy_attach(0, 0, 0, -1)

    /* like qnx_rem_proxy_attach */
    qoip_event_rem_attach("bitctrl.de", (qoip_event_t *) &proxy, &event);

    msg.type = MSG_GIVE_EVENT;
    msg.event = event;
    pid = qoip_name_locate("bitctrl.de", "bitctrl/qoip/test", 0);
    Send (pid, &msg, &msg, sizof(msg), sizeof(msg));

    rcvid = Receive(0, &msg, sizeof(msg));
    if (rcvid == proxy) {
       printf("Got a proxy %d \n", proxy);
    }
    ...
    qoip_event_rem_detach(&event);
    qoip_name_close(pid);

    DienstprogrammeZurück zum Seitenanfang
    qoipp - QoIP proxy
      Verwendung:
        qoipp [-Optionen]
      Wobei:
        Optionen:
        -v verbose (-vv ... more verbose)
        -p <port> Start aus der Shell mit Port <port>
        -t <sec> Verbindungs-Timeout (standard 3 sec.)
      Beispiele:
        qoipp -v
      Version:
        1.0
    qoipd - QoIP daemon
      Verwendung:
        qoipd [-Optionen]
      Wobei:
        Optionen:
        -v verbose (-vv ... more verbose)
        -p <port> Start aus der Shell mit Port <port>
        -t <sec> Verbindungs-Timeout (standard 3 sec.)
      Beispiele:
        qoipd -v -p 13100
      Version:
        1.0
    ProgrammreferenzZurück zum Seitenanfang
    qoipp_name_locate
     

    Lokalisiert einen auf einem anderen Rechner laufenden Prozeß anhand seines registrierten Namens.

      Übersicht:
       

    #include <qoip.h>
    int qoip_name_locate(char *host,
                         char *name,
                         unsigned flags,
                         unsigned msgsize);

      Bibliothek:
       

    QNX® 4: qoip3r.lib, QNX® 6: libqoip.a

      Beschreibung:
       

    Die Funktion qoip_name_locate() lokalisiert einen Prozeß auf einem anderen Computer mit Hilfe des Namens der mit der Funktion qnx_name_attach() (QNX® 4)or name_attach() (QNX® 6) vergeben wurde.

       

    char *host :

    Name des 'entfernten' Computers oder IP Adresse als String

       

    char *name :

    Der zu lokalisierende Name. Namen dürfen bis zu 32 Zeichen lang sein (QNX® 4). Wenn das erste Zeichen ein Schrägstrich ist (/), wird er als netzwerkweit betrachtet. Das Flag OIP_NAME_FLAG_LOCAL wird dann ignoriert.

       

    ungek.
    Flags :

    QOIP_NAME_FLAG_LOCAL - Name lokal zugewiesen.
    QOIP_NAME_FLAG_GLOBAL - Name global zugewiesen.

       

    Größe der
    Meldung :

    Max. Größe der Meldung in Bytes. 1 - 65535, 0 für 64Kbyte.

      Rückgabewerte:
       

    Eine Prozeß ID (QNX® 4), Verbindungs ID (QNX® 6), oder -1 wenn ein Fehler aufgetreten ist - errno spezifiziert den aufgetretenen Fehler.

      Fehler:
       

    ESRCH - Kein Prozeß mit diesem Namen vorhanden.
    ECONNREFUSED - Verbindung abgelehnt
    ENOMEM - Speicher reicht nicht aus
    Diese Funktion kann während seiner Ausführung ebenso Fehlercodes des lokalen oder entfernten Computers zurückliefern.

      Beispiele:
       

    (QNX® 4):
    if((pid = qoip_name_locate("192.168.1.123", "QoIPTest",
                   QOIP_NAME_FLAG_GLOBAL, 0))< 0) {
      perror("qoip_name_locate()");
      exit(EXIT_FAILURE);
    }

    Send(pid, &msg, &msg, sizeof(msg), sizeof(msg));
    ...

    qoip_name_close(pid);

    (QNX® 6):
    if((coid = qoip_name_locate("192.168.1.123", "QoIPTest",
                   QOIP_NAME_FLAG_GLOBAL, 0))< 0) {
      perror("qoip_name_locate()");
      exit(EXIT_FAILURE);
    }

    MsgSend(coid, &msg, sizeof(msg), &msg, sizeof(msg));
    ...

    qoip_name_close(coid);

      Sicherheit:
       

    Interrupt Handler      Nein
    Signal Handler         Nein
    Thread                 Ja

    qoip_name_close
     

    Schließt die mit dem Funktionsaufruf qoip_name_locate() etablierte Verbindung.

      Übersicht:
       

    #include <qoip.h>
    int qoip_name_close(int coid);

      Bibliothek:
       

    QNX® 4: qoip3r.lib, QNX® 6: libqoip.a

      Beschreibung:
       

    Die Funktion name_close() schließt die mit qoip_name_locate() geöffnete Verbindung.

    Hinweis: Die Verbindung wird bei Programmende nicht automatisch geschlossen.

      Rückgabewerte:
       

    Null bei Erfolg oder -1 falls ein Fehler aufgetreten ist (errno ist gesetzt).

      Fehler:
       

    EBADF - Ungültige Verbindungs ID.
    EINTR - Der qoip_name_close() Aufruf wurde durch Signal unterbrochen.
    ESRCH - Es läuft kein Proxy- oder Daemon-Prozeß.

      Beispiele:
       

    Siehe qoip_name_open().

      Sicherheit:
       

    Interrupt Handler      Nein
    Signal Handler         Nein
    Thread                 Ja

    qoip_event_rem_attach
     

    Erzeugt einen virtuellen Event / Proxy auf einem 'entfernten' Rechner.

      Übersicht:
       

    #include <qoip.h>
    int qoip_event_rem_attach(char *host,
                           qoip_event_t *levent,
                           qoip_event_t *revent);

      Bibliothek:
       

    QNX® 4: qoip3r.lib, QNX® 6: libqoip.a

      Beschreibung:
       

    Die Funktion qoip_event_rem_attach() erzeugt einen virtuellen Event/Proxy auf einem 'entfernten' Rechner. Das ermöglicht jedem Prozeß einen Trigger (QNX® 4) oder MsgDeliverEvent() auf diesem Rechner auszuführen. Bei einem QNX® 4 Knoten muss lokal schon ein Proxy (durch qnx_proxy_attach() )laufen.

    char *host : Name des 'entfernten' Computers oder IP Adresse als String
    qoip_event_t *levent : lokaler event/proxy
    qoip_event_t *revent : Puffer für den virtuellen 'entfernten' event/proxy

      Rückgabewerte:
       

    Die Funktion qoip_event_rem_attach() gibt Null und das virtuelle 'entfernte' Ereignis (virtual remote event) im *revent Puffer zurück wenn die Funktion erfolgreich war. Beim Auftreten eines Fehlers wird -1 zurückgeliefert und errno gesetzt.

      Fehler:
       

    EINVAL - Ungültiger Proxy.
    EPERM - Keine Erlaubnis für Proxy.
    ESRCH - Proxy existiert nicht.
    Diese Funktion kann während seiner Ausführung ebenso Fehlercodes des lokalen oder entfernten Computers zurückliefern.

      Beispiele:
       

    Siehe Server/Client Beispiele im QoIP Paket.

      Sicherheit:
       

    Interrupt Handler      Nein
    Signal Handler         Nein
    Thread                 Ja

    qoip_event_rem_detach
     

    Gibt virtuellen Event/Proxy Prozeß auf einem 'entfernten' Rechner frei.

      Übersicht:
       

    #include <qoip.h>
    int qnx_event_rem_detach(char *host, qoip_event_t *revent);

      Bibliothek:
       

    QNX® 4: qoip3r.lib, QNX® 6: libqoip.a

      Beschreibung:
       

    Die Funktion qoip_proxy_rem_detach() gibt auf 'entfernten' Rechnern virtuelle 'entfernte' event/proxy *revent (virtual remote event/proxy *revent) frei, die vorher mit der Funktion qoip_event_rem_attach() erzeugt wurden.

    Hinweis: Wenn ein Prozeß stirbt werden die verknüpften virtuellen Events/Proxies nicht automatisch entfernt.

    char *host : Name des 'entfernten' Computers oder IP Adresse als String
    qoip_event_t *revent : Virtueller 'entfernter' Event/Proxy

      Rückgabewerte:
       

    Die Funktion qoip_event_rem_detach() gibt Null zurück wenn die Funtktion erfolgreich war. Beim Auftreten eines Fehlers wird -1 zurückgeliefert und errno gesetzt.

      Fehler:
       

    EBADF - Ungültiges Event.
    Diese Funktion kann während seiner Ausführung ebenso Fehlercodes des lokalen oder entfernten Computers zurückliefern.

      Beispiele:
       

    Siehe Server/Client Beispiele im QoIP Paket.

      Sicherheit:
       

    Interrupt Handler      Nein
    Signal Handler         Nein
    Thread                 Ja

    Home    Datenschutzerklärung    Haftungsausschluss    Impressum   
    © 2011 BitCtrl Systems GmbH