ネットワークインタフェース

非同期コネクションレスモードサービス

非同期コネクションレスモードネットワーキングはエンドポイントに非ブロッキングサービスを構成し、データの転送時期をポーリングまたは非同期通知によって受信することにより行われます。非同期通知が使用された場合、実際のデータの受信は通常シグナルハンドラ内で行われます。

エンドポイントの非同期化

エンドポイントの確立が t_open(3NSL) により行われ、t_bind(3NSL) により識別が確立された後、エンドポイントを非同期サービスで使用するために構成することが可能です。これは fcntl(2) 関数を使用し、エンドポイント上に O_NONBLOCK フラグを設定することにより可能です。これにより、使用可能なバッファー領域がすぐに確保できない場合、t_sndudata(3NSL) への呼び出しは -1 を戻し、t_errnoTFLOW に設定します。同様に、データが存在しない場合、 t_rcvudata(3NSL) への呼び出しは -1 を戻し、t_errnoTNODATA に設定します。

非同期ネットワーク転送

データの着信、またはエンドポイント上でのデータ受信待機のチェックを定期的に行うためにアプリケーションが poll(2) 関数を使用することは可能ですが、データが着信した場合に非同期通知の受信が必要な場合があります。ioctl(2) 関数の I_SETSIG を使用することにより、エンドポイント上にデータが着信した場合、プロセスに 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 内のメッセージの処理*/
}