|
|
|
|
|
QNX® IPC over IP
Dokumentation |
|
|
| Beschreibung |  |
|
 |
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 ermöglicht die Anwendung der QNX® 4
Interprocess Communication auch auf dem OS QNX® 6.

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/.
|
 |
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.
|
 |
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 Schnellstart |  |
|
|
|
|
|
 |
QNX® 6 Installation |
| |
- Download des Pakets qoip-1.0-nto-x86.tgz
- Paket entpacken und in folgendes Verzeichnis wechseln
$ tar -zxvf qoip-1.0-nto-x86.tgz
$ cd qoip/v1.0
- zu Nutzer 'root' wechseln und Setup-Skript starten
$ su root
# ./setup
# exit
$
- QoIp Daemon und / oder Proxy starten (paketabhängig)
$ /usr/local/bin/qoipp
$ /usr/local/bin/qoipd
- Lizenzinformation aktualisieren
# license -r
- make Beispiele
$ cd src
$ cd server
$ make clean
$ make
$ ./server &
$ cd ../client
$ make clean
$ make
$ ./client localhost
- 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 Programmentwicklung |  |
|
 |
Ü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); |
|
|
|
| Dienstprogramme |  |
|
 |
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 |
|
|
|
| Programmreferenz |  |
|
 |
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 |
|
|
|
|