非同期コネクションレスモードネットワーキングを行うには、終端を非ブロッキングサービス向けに構成して、次に、非同期通知をポーリングするか、データが転送されたときに非同期通信を受信します。非同期通知が使用された場合、実際のデータの受信は通常シグナルハンドラ内で行われます。
終端を非同期サービス向けに構成するには、t_open(3NSL) を使用して終端を確立したあと、t_bind(3NSL) を使用してその識別情報を確立します。次に、fcntl(2) インタフェースを使用して、終端に O_NONBLOCK フラグを設定します。すると、バッファー領域をすぐに確保できない場合でも、t_sndudata (3NSL) への呼び出しは -1 を返し、t_errno に TFLOW を設定します。同様に、データが存在しない場合でも、t_rcvudata(3NSL) への呼び出しは -1 を返し、t_errno に TNODATA を設定します。
アプリケーションは poll(2) を使用して終端にデータが着信したかどうかを定期的に確認したり、終端がデータを受信するまで待機したりできますが、データが着信したときには非同期通知を受信する必要があります。I_SETSIG を指定して ioctl(2) コマンドを使用すると、終端にデータが着信したときに SIGPOLL シグナルがプロセスに送信されるように要求できます。アプリケーションは複数のメッセージが単一のシグナルとして送信されないように確認する必要があります。
次の例で、アプリケーションによって選択されたトランスポートプロトコル名は protocol です。
#include <sys/types.h>
#include <tiuser.h>
#include <signal.h>
#include <stropts.h>
int fd;
struct t_bind *bind;
void sigpoll(int);
fd = t_open(protocol, O_RDWR, (struct t_info *) NULL);
bind = (struct t_bind *) t_alloc(fd, T_BIND, T_ADDR);
... /* バインディングアドレスを設定 */
t_bind(fd, bind, bin
/* 終端を非ブロッキングにする */
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
/* SIGPOLL 用のシグナルハンドラを確立 */
signal(SIGPOLL, sigpoll);
/* 受信データが使用できるときは SIGPOLL シグナルを要求 */
ioctl(fd, I_SETSIG, S_INPUT | S_HIPRI);
...
void sigpoll(int sig)
{
int flags;
struct t_unitdata ud;
for (;;) {
... /* ud を初期化 */
if (t_rcvudata(fd, &ud, &flags) < 0) {
if (t_errno == TNODATA)
break; /* これ以上メッセージなし */
... /* ほかのエラー状態を処理 */
}
... /* ud でメッセージを処理 */
}