|
Beschreibung
Mit der Funktion t_rcvudata() kann der Benutzer im verbindungslosen Modus ein Datagramm von einem anderen Benutzer empfangen.
Der Parameter fd spezifiziert den lokalen Transportendpunkt, über den das Datagramm empfangen wird.
flags informiert den Benutzer nach Ausführung von t_rcvudata(), ob das Datagramm vollständig empfangen wurde.
unitdata ist ein Zeiger auf ein Objekt vom Typ struct t_unitdata, in dem t_rcvudata() Informationen über das empfangene Datagramm zurückliefert.
Die Struktur t_unitdata ist in <xti.h> wie folgt deklariert:
struct t_unitdata { struct netbuf addr; struct netbuf opt; struct netbuf udata; };
Vor Aufruf von t_rcvudata() muss der Benutzer in den einzelnen netbuf-Strukturen von *unitdata die Komponente maxlen mit dem Wert für die jeweils maximale Puffergröße versorgen.
Nach Ausführung von t_rcvudata() enthält unitdata->addr die Protokolladresse des Senders, unitdata->opt enthält protokollspezifische Optionen, die das empfangene Datagramm betreffen und unitdata->udata enthält die empfangenen Benutzerdaten.
Im Standardfall arbeitet t_rcvudata() im synchronen Modus, d.h. t_rcvudata() wartet auf die Ankunft eines Datagramms und blockiert, falls momentan keine Datagramme vorhanden sind.
Wenn jedoch zuvor mit t_open() oder der POSIX-Funktion fcntl() für den durch fd spezifizierten Transportendpunkt O_NDELAY oder O_NONBLOCK gesetzt wurde, arbeitet t_rcvudata() im asynchronen Modus und beendet sich mit Fehler, falls keine Datagramme vorhanden sind. Dabei liefert t_rcvudata() den Returnwert -1 zurück und setzt t_errno auf TNODATA.
Wenn der Puffer in unitdata->udata für die Aufnahme des Datagramms nicht groß genug ist, legt t_rcvudata() das Datagramm so weit wie möglich im Puffer ab und setzt das Flag T_MORE. Das Flag T_MORE zeigt an, dass ein weiterer t_rcvudata()-Aufruf erforderlich ist, um den Rest des Datagramms zu empfangen. Solange das Datagramm nicht vollständig empfangen ist, liefern nachfolgende t_rcvudata()-Aufrufe als Länge von Protokolladresse und Optionen jeweils den Wert 0 zurück.
Returnwert
0:
Bei Erfolg.
-1:
Bei Fehler. t_ errno wird gesetzt, um den Fehler anzuzeigen.
Fehler
TBADF
Der angegebene Dateideskriptor verweist nicht auf einen Transportendpunkt.
TBUFOVFLW
Die Anzahl der Bytes, die für die zurückzuliefernde Protokolladresse oder die Optionen angelegt wurde, ist zu klein, um diese Informationen zu speichern. Die Informationen, die in *unitdata zurückzuliefern sind, werden gelöscht.
TLOOK
Auf dem durch fd übergebenen Transportendpunkt ist ein asynchrones Ereignis eingetreten und erfordert sofortige Bearbeitung.
TNODATA
O_NDELAY oder O_NONBLOCK wurde gesetzt, aber es sind zurzeit keine Datagramme vom Transportanbieter verfügbar.
TNOTSUPPORT
Diese Funktion wird vom darunter liegenden Transportanbieter nicht unterstützt.
TOUTSTATE
Innerhalb einer Sequenz von XTI-Funktionsaufrufen für den Transportendpunkt fd wurde die Funktion an der falschen Stelle aufgerufen.
TSYSERR
Während der Ausführung dieser Funktion ist ein Systemfehler aufgetreten.
Im diesem Fall enthält die Fehlervariable errno genauere Informationen:
EFAULT | Der Bereich, der in unitdata->addr, unitdata->opt oder unitdata->udata angegeben ist, liegt außerhalb des Prozess-Adressbereichs. |
ETIME | Das Datagramm wurde gelöscht, da ein transportsystem-abhängiges Zeitlimit überschritten wurde (siehe auch "Abhängigkeiten vom BS2000-Transportsystem BCAM"). |
EINTR | Der Aufruf wurde durch ein Signal unterbrochen. |