接続モードサービスの場合、アプリケーションは、データ転送だけではなく接続も非同期に確立されるように設定できます。操作のシーケンスは、プロセスが他のプロセスに接続しようとしているのか、接続試行を待っているのかによって異なります。
プロセスは、接続を試みてから非同期に完了できます。プロセスはまず接続エンドポイントを作成し、fcntl(2) を使用してエンドポイントを非ブロッキング操作用に設定します。接続なしデータ転送の場合と同様に、エンドポイントは接続の完了と以降のデータ転送について非同期通知を行うように設定することもできます。次に、接続プロセスは t_connect(3N) 関数を使用して転送の設定を開始します。最後に、t_rcvconnect(3N) 関数を使用して接続が確立されたことを確認します。
接続を非同期に待つには、プロセスはまずサービスアドレスに結合した非ブロッキングエンドポイントを確立します。poll(2) の結果または非同期通知によって接続要求が到着したことがわかったら、プロセスは t_listen(3N) 関数を使用して接続要求を取得できます。接続を受け入れるには、プロセスは t_accept(3N) 関数を使用します。応答するエンドポイントは、非同期データ転送用に別個に設定しなければなりません。
#include <tiuser.h> int fd; struct t_call *call; fd = .../* 非ブロッキングエンドポイントを確立する */ call = (struct t_call *) t_alloc(fd, T_CALL, T_ADDR); .../* call 構造体を初期化する */ t_connect(fd, call, call); /* 接続要求は現在非同期に進行している */ .../* 接続が受け付けられたという通知を受け取る */ t_rcvconnect(fd, &call);
#include <tiuser.h> int fd, res_fd; struct t_call call; fd = ... /* 非ブロッキングエンドポイントを確立する */ .../* 接続要求が到着したという通知を受け取る */ call = (struct t_call *) t_alloc(fd, T_CALL, T_ALL); t_listen(fd, &call); .../* 接続を受け入れるかどうかを決定する */ res_fd = ... /* 応答用に非ブロッキングエンドポイントを確立する */ t_accept(fd, res_fd, call);