|
Hauptseite - Welches System? - Hardware - Software - Emulatoren - |
Internet MausNet Programmieren Verweise Über |
Protokolle, die sorgfältig Flußkontrollmechanismen implementieren, können
von unzuverlässigen Datenwegen leicht ausgebremst werden. Wenn
Acknowledgement-Datagramme, also solche, die abgeschickt werden, um eine
Bestätigung eines Verbindungsaufbaus mit dem Remote Host zu erhalten,
verlorengehen, kann es eine Weile dauern, bis die Antwort kommt und ein
weiteres Acknowledgement-Datagramm versendet wird. Mit dieser Funktion kann
die sofortige Übermittlung einer "Bestätigung" (Acknowledgement)
und von Daten, die noch nicht bestätigt wurden, erzwungen bzw.
beschleunigt werden.
Da TCP darauf ausgelegt wurde, auch unter schlechtesten Umständen zu
arbeiten, sollte diese Funktion mit Bedacht benutzt werden! Vermeiden sie
die häufige Verwendung von CNkick! Wird sie bei UDP Pseudo-Verbindungen
benutzt, so hat diese Funktion keine Wirkung.
Liefert E_NORMAL, oder E_UNREACHABLE, E_CONNECTFAIL, E_REFUSE oder
E_RRESET.
Der Connection Manager
Der Connection Manager enthält all die Funktionen, die von High-Level-Protokollen
wie TCP und UDP zur Verfügung gestellt werden, um Daten von einem Client
zu empfangen. Es gibt Funktionen, um einzelne Bytes oder ganze Datenblöcke
zu empfangen und Informationen über Verbindungsparameter zu bekommen.
Die Aufrufe:
Die Funktion CNkick
int16 cdecl CNkick (int16 handle);
Funktion: "Kickt" eine Verbindung (s. Beschreibung)
Die Funktion CNbyte_count
int16 cdecl CNbyte_count (int16 handle);
Liefert Informationen über die Anzahl der empfangenen "schwebenden"
Bytes.
In jeder TCP- oder UDP-Pseudo-Verbindung kann mit diesem Aufruf in Erfahrung
gebracht werden, wieviele Bytes im Input-Puffer angekommen sind. Die
zurückgelieferte Anzahl der Bytes kann sofort in den für den Empfang
zuständigen Aufrufen CNget_char,
CNget_NDB, CNget_block oder
CNgets weiterverwendet werden.
Gibt die Anzahl der Bytes oder E_LISTEN, E_NODATA, E_EOF, E_UNREACHABLE, E_CONNECTFAIL, E_REFUSE oder E_RRESET zurück.
int16 cdecl CNget_char (int16 handle);Holt ein empfangenes Zeichen oder Byte aus einer Verbindung.
Diese Funktion holt ein einzelnes Zeichen oder Byte aus der Input-Queue der TCP- oder UDP-Pseudo-Verbindung, die von 'handle' festgelegt wurde.
Liefert das erhaltene Byte (das untere Byte eines 16 Bit-Wortes), oder E_LISTEN, E_EOF, E_NODATA, E_UNREACHABLE, E_CONNECTFAIL, E_REFUSE oder E_RRESET.
NDB * cdecl CNget_NDB (int16 handle);Holt einen Datenblock aus der Verbindung.
Ähnlich CNget_char holt diese Funktion einen ganzen Datenblock aus der Input-Queue der TCP- oder UDP-Pseudoverbindung, die durch 'handle' spezifiziert wurde. Diese Blöcke entsprechen ankommenden Datagrammen. Diese Funktion ist daher wahrscheinlich die beste Möglichkeit, UDP Datagramme zu empfangen, doch es ist auch die effizienteste Methode, hereinkommende Daten einer TCP-Verbindung aufzunehmen.
Die Funktion gibt einen Pointer auf einen Network Data Block zurück. Die Struktur und die zugehörigen Daten sind ge'KRmalloc'te Blöcke, für die nun die aufrufende Applikation zuständig ist (mit jeder Struktur muß KRfree aufgerufen werden). Die Struktur beinhaltet als Einträge die Adresse der Daten ('ndata') und die Länge der gültigen Bytes ('len'). Etwas C-Code zeigt, wie ein NDB verwaltet werden sollte.
Die Funktion liefert den Pointer auf den nächsten Datenblock, oder NULL, wenn ein Fehler aufgetreten ist oder keine NDBs in der Queue sind.
int16 cdecl CNget_block (int16 handle, char *buffer, int16 length);Holt einen empfangenen Datenblock aus einer Verbindung.
Bisher ist keine Funktionsbeschreibung verfügbar, da sie demnächst möglicherweise noch in ihrer Spezifikation erweitert wird. Hier eine Vorabversion von Steve Adam:
CIB * cdecl CNgetinfo (int16 handle);Holt Informationen über eine Verbindung ein.
Die Funktion liefert einen Pointer auf eine CIB-Struktur zurück, die alle wichtigen Informationen über eine Verbindung enthält.
CIB-Struktur:Die "Connection Information Block"-Struktur. Ein Pointer
auf diese Struktur wird von CNgetinfo zurückgeliefert.
Die Informationen umfassen IP-Adressen beider Endpunkte, Portnummer usw.
Diese Information wird von STinG automatisch aktualisiert, aber es ist
nicht möglich, das Verhalten der Verbindung zu verändern, indem man in
die CIB-Struktur schreibt.
Nachdem die assoziierte (TCP+UDP) Verbindung über den entsprechenden Aufruf
geschlossen wurde, darf auf die CIB-Struktur nicht mehr zugegriffen werden.
Es wird entweder ein Pointer auf die CIB-Struktur oder, im Falle eines Fehlers,
NULL zurückgeliefert.
Ähnlich dem gets() - Aufruf aus stdio empfängt diese Funktion Daten,
bis ein festgelegter Begrenzer erreicht wird. In Textübertragungen
wird 'delim' meist '\r' oder '\n' sein. Im ersten Fall werden zum Beispiel
alle Daten bis zum Byte '\r' in den Puffer übertragen, sofern die
Länge, wie in 'len' festgelegt, paßt. Das'\r' wird gelesen,
aber nicht übertragen; der Block wird im Puffer mit dem Byte '\0'
terminiert. Der Aufruf liefert die Anzahl der Bytes bis zum Begrenzer,
also die Größe des Puffers ohne das abschließende Byte '\0'.
Es ist zu beachten, daß bei mit "\r\n" beendeten Blöcken der Aufruf das
"\n" nicht filtern wird, wenn 'delim' als "\r" festgelegt ist, und umge-
kehrt.
Offensichtlich ist diese Funktion am sinnvollsten für Stream-orientierte
Verbindungen (TCP), sie funktioniert aber auch mit Datagramm-basierten
(UDP). Bei diesen werden die Datagramme wie ein Datenstrom behandelt.
Dies macht natürlich nur unter besonderen Umständen Sinn.
Die Funktion liefert E_NORMAL zurück, wenn alles glatt läuft;
bei zuwenig Daten im Input-Puffer, so daß der Begrenzer nicht gefunden
wird, wird E_NODATA zurückgegeben, oder E_BIGBUF, wenn der Puffer nicht
alle Daten aufnehmen kann. In den letzten beiden Fällen werden keine
Daten gelesen.
typedef struct cib {
uint16 protocol; /* TCP or UDP or ... */
CAB address; /* Adress information */
uint16 status; /* Net status. 0 means normal */
} CIB;
Net Status:
Der ICMP Network Status für die TCP/UDP-Verbindung ist ein 16 Bit Wort,
das Informationen des zuletzt empfangenen ICMP Packets über die
Verbindung enthält. Der ICMP-Typ ist in den oberen 8 Bits codiert,
der ICMP-Code findet sich in den unteren 8 Bits. Der ICMP-Typ kann sein:
Die Bedeutung des ICMP-Codewertes hängt vom ICMP-Typ ab.
Die Funktion CNgets
int16 cdecl CNgets (int16 cn, uint8 *buffer, int16 len, uint8 delim);
Holt einen begrenzten Block aus einer Verbindung.
Zurück zur Startseite
Zum Anfang der Seite
English version not yet available. |