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

非同期ネットワーク転送

データの着信、またはエンドポイント上でのデータ受信待機のチェックを定期的に行うためにアプリケーションが 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 内のメッセージの処理*/
}