非同期接続なしモードのネットワーキングは、非ブロッキングサービスのエンドポイントを設定して、データ転送についての非同期通知をポーリングまたは受信することによって行われます。非同期通知を使用する場合は、実際のデータ受信はシグナルハンドラ内で行われます。
t_open(3N) によってエンドポイントを確立して、t_bind(3N) によって識別情報を確立したら、エンドポイントを非同期サービス用に設定できます。これは、fcntl(2) 関数によってエンドポイントに O_NONBLOCK フラグを設定して行います。これ以降は、 t_sndudata(3N) を呼び出すと、バッファ空間がすぐに利用できない場合は -1 が戻され、t_errno が TFLOW に設定されます。同様に t_rcvudata(3N) を呼び出すと、データがない場合は -1 が戻され、t_errno が TNODATA に設定されます。
アプリケーションは、poll(2) 関数を使用してエンドポイントでデータの受信を定期的に調べるか、データの受信を待つことができますが、データが到着したことを知らせる非同期通知を受信する必要がある場合もあります。この場合は、ioctl(2) 関数に I_SETSIG コマンドを付けて実行し、エンドポイントにデータが到着したら SIGPOLL シグナルをプロセスに送信するように要求します。アプリケーションは、複数のメッセージによって 1 つのシグナルが生成される場合についても対処しなければなりません。
次の例で、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 内のメッセージを処理する */
}