|
Beschreibung
Mit der Funktion t_connect() sendet der Transportbenutzer über den lokalen Transportendpunkt fd eine Verbindungsanforderung an einen anderen Transportbenutzer, der durch die im Parameter sndcall übergebene Protokolladresse spezifiziert ist.
Die Parameter sndcall und rcvcall zeigen auf jeweils ein Objekt vom Typ struct t_call.
Die Struktur t_call ist in <xti.h> wie folgt deklariert:
struct t_call { struct netbuf addr; struct netbuf opt; struct netbuf udata; int sequence; };
In sndcall übergibt der Aufrufer von t_connect() Informationen, die der Transportanbieter benötigt, um eine Verbindungsanforderung zu senden:
sndcall->addr enthält die Protokolladresse des Transportendpunkts, an den die Verbindungsanforderung gesendet werden soll.
sndcall->opt enthält protokollspezifische Informationen, die der Transportanbieter benötigt. sndcall->opt spezifiziert aber nicht die Struktur der Optionen, da der Transportanbieter die Struktur aller an ihn übergebenen Optionen selbst festlegt. Diese Optionen sind spezifisch für das darunter liegende Protokoll des Transportanbieters.
Wenn der Benutzer in sndcall->opt.len den Wert 0 übergibt, wählt der Transportanbieter Standardoptionen aus und der Benutzer muss die Optionen nicht mit dem Transportanbieter aushandeln.
Da das Senden von Benutzerdaten nicht unterstützt wird, ist sndcall->udata für t_connect() ohne Bedeutung. sndcall->sequence ist ebenfalls ohne Bedeutung für t_connect().
In rcvcall liefert t_connect() bei erfolgreicher Ausführung Informationen über die soeben eingerichtete Verbindung zurück:
rcvcall->addr enthält die Protokolladresse des Transportendpunkts, der die Verbindungsanforderung mit t_accept() angenommen hat.
Vor Aufruf von t_connect() muss der Benutzer in rcval->addr.maxlen die maximale Länge des Ergebnispuffers (rcval->addr.buf) bekannt geben.rcval->opt enthält protokollspezifische Informationen, die die neu eingerichtete Verbindung betreffen.
Vor Aufruf von t_connect() muss der Benutzer in rcval->opt.maxlen die maximale Länge des Ergebnispuffers (rcval->opt.buf) bekannt geben.
Da das Empfangen von Benutzerdaten nicht unterstützt wird, ist rcvcall->udata für t_connect() ohne Bedeutung. rcvcall->sequence ist ebenfalls ohne Bedeutung für t_connect().
Im Standardfall arbeitet t_connect() im synchronen Modus. Im synchronen Modus wartet (blockiert) t_connect() solange, bis eine Antwort des Zielbenutzers, d.h. des Transportbenutzers, an den die Verbindungsanforderung gesendet wurde, eintrifft. Erst nach Empfang der Antwort gibt t_connect() die Kontrolle wieder an den aufrufenden Transportbenutzer zurück. Eine erfolgreiche Durchführung (Returnwert 0) von t_connect() zeigt an, dass die angeforderte Verbindung eingerichtet wurde.
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, wird t_connect() im asynchronen Modus ausgeführt. Im asynchronen Modus wartet t_connect() nicht auf die Antwort des Zielbenutzers, sondern gibt die Kontrolle nach Abfrage des Status der Verbindungsanforderung sofort wieder an den aufrufenden Benutzer zurück. Falls die angeforderte Verbindung noch nicht eingerichtet ist, liefert t_connect() den Returnwert -1 zurück und setzt t_errno auf TNODATA.
Im asynchronen Modus leitet t_connect() den Verbindungsaufbau also einfach durch Senden einer Verbindungsanforderung an den Zielbenutzer ein. Mit der Funktion t_rcvconnect() kann der lokale Benutzer den Status der angeforderten Verbindung abfragen.
Returnwert
0:
Bei Erfolg.
-1:
Bei Fehler. t_ errno wird gesetzt, um den Fehler anzuzeigen.
Fehler
TACCES
Der Benutzer hat keine Erlaubnis, die angegebene Adresse oder die angegebenen Optionen zu verwenden.
TBADADDR
Die angegebene Protokolladresse hatte ein falsches Format oder enthielt falsche Informationen.
TBADDATA
Das Senden von Benutzerdaten wird nicht unterstützt.
TBADF
Der angegebene Dateideskriptor verweist nicht auf einen Transportendpunkt.
TBADOPT
Die angegebenen Protokolloptionen hatten ein falsches Format oder enthielten falsche Informationen.
TBUFOVFLW
Die Anzahl der Bytes, die für einen Ergebnisparameter reserviert wurden, reichen nicht aus, um den Wert des Parameters zu speichern. Falls im synchronen Modus gearbeitet wird, wird der Zustand des Transportanbieters aus Benutzersicht auf den Zustand T_DATAXFER gesetzt, und die Information für die Verbindungsanforderung, die in *rcvcall zurückgeliefert werden soll, wird entfernt.
TLOOK
Auf dem durch fd übergebenen Transportendpunkt ist ein asynchrones Ereignis eingetreten und erfordert sofortige Bearbeitung.
TNODATA
O_NDELAY oder O_NONBLOCK wurde gesetzt, sodass die Funktion den Vorgang des Verbindungsaufbaus erfolgreich einleiten konnte, jedoch nicht auf eine Antwort vom fernen Benutzer wartet.
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.
Siehe auch
t_accept(), t_getinfo(), t_listen(), t_open(), t_optmgmt(), t_rcvconnect(), fcntl()