t_accept() - 接続要求の受け入れ

標準

標準/拡張機能 C/C++ 依存項目
XPG4.2 両方  

形式

#define _XOPEN_SOURCE_EXTENDED 1
#include <xti.h>

int t_accept(int fd, int resfd, struct t_call *call);

機能説明

t_accept() は、接続要求を受け入れるために トランスポート・ユーザーによって発行されます。パラメーター fd は、接続指示が到着するローカル・トランスポート終点を識別します。resfd は接続が確立されるローカル・トランスポート終点 を指定し、call には、接続を完了するために トランスポート提供者が必要とする情報が含まれています。パラメーター call は、次のメンバーを含む t_call 構造体を指します。
        struct netbuf   addr;
        struct netbuf   opt;
        struct netbuf   udata;
        int             sequence;
call では、addr は 呼び出しトランスポート・ユーザーのプロトコル・アドレスです。opt は、接続と関連している任意のオプションを示して います。udata は呼び出し元に戻されるユーザー・データを指し、sequence とは、応答を前に受け取った接続指示と一意的に関連付ける t_listen() によって戻される値です。呼び出し元のアドレス、addr は、NULL (長さゼロ) のことがあります。addr が NULL 以外の場合には、これは任意に XTI でチェック できます。

トランスポート・ユーザーは、接続指示が達するものと同じまたは異なるローカル・トランスポート終点で、接続を受け入れます。同じ終点 (resfd==fd) で接続を受け入れる前に、ユーザーは、(t_accept() または t_snddis() を使用して) そのトランスポート終点で受け入れた以前の接続指示に、応答している必要があります。そうでない場合には、t_accept() は失敗して、t_errnoTINDOUT に設定します。

異なるトランスポート終点 (resfd!=fd) を 指定した場合には、ユーザーは、t_accept() が発行される前に その終点のバインドを選択してもしなくても構いません。終点が t_accept() の 前にバインドされない場合には、トランスポート提供者は自動的に これを fd がバインドされるものと 同じプロトコル・アドレスにバインドします。トランスポート・ユーザーが終点のバインドを選択した場合には、ゼロの qlen を使用してこれをプロトコル・アドレスに バインドし、t_accept() を発行する前にこれを T_IDLE 状態にする 必要があります。

終点 fd で受け取りを待機している指示 (例えば、接続または切断) がある場合には、t_accept() に対する呼び出しは、TLOOK に設定された t_errno を使用すると 失敗します。

接続の受け入れ中にユーザー・データを戻しても、TCP では サポートされないので、常に udata フィールドは 無意味です。

ユーザーが、オプション (call->opt.len == 0) を指示しないときには、接続は無条件に受け入れられるものと見なされます。接続の正常な受け入れを確実にするには、トランスポート提供者は、デフォルト以外のオプションを選択できます。

インプリメンテーションの制約事項のために、異なるプロセスが (t_listen を 使用して) 接続を取得した終点で保留になっているその接続を 受け入れる動作は未定義です。

有効状態: fd: T_INCON resfd (fd!=resfd): T_IDLE

戻り値

正常に実行された場合、t_accept() は 0 を戻します。

正常に実行されなかった場合、t_accept() は -1 を戻して、t_errno を 次のいずれかの値に設定します。
エラー・コード
説明
TACCES
ユーザーは、応答トランスポート終点で接続を受け入れる許可 または指定されたオプションを使用する許可をもっていません。
TBADADDR
指定されたプロトコル・アドレスは正しくない形式であったか、あるいは無許可の情報が含まれていました。
TBADDATA
指定されたユーザー・データ量は、トランスポート提供者が 許可した範囲内に入っていませんでした。
TBADF
ファイル記述子 fd または resfd が、トランスポート終点を指していません。
TBADOPT
指定されたオプションは正しくない形式であったか、あるいは無許可の情報が含まれていました。
TBADSEQ
無効のシーケンス番号が指定されました。
TINDOUT
関数は fd==resfd を使用して呼び出されましたが、終点に未解決の接続指示があります。これらの他の接続指示は、t_snddis (3) を使用してリジェクトするか、あるいは t_accept (3) を使用して、異なる終点で受け入れて処理する必要があります。
TLOOK
fd が参照したトランスポート終点で非同期イベントが起こって、即時のアテンションが必要です。
TNOTSUPPORT
この関数は、基礎トランスポート提供者によって サポートされません。
TOUTSTATE
関数が fd によって参照されたトランスポート終点で、正しくないシーケンスで呼び出されたか、resfd によって参照された トランスポート終点が適切な状態になっていません。
TPROTO
このエラーは、XTI と他に適切な XTI (t_errno) が ないトランスポート提供者の間で通信問題が検出されたことを 示しています。
TPROVMISMATCH
ファイル記述子 fd と resfd は、同じトランスポート提供者を 指していません。
TRESADDR
このトランスポート提供者では、fdresfd の両方が同じアドレスにバインドされることが必要であり、この条件が満たされていないとエラーになります。
TRESQLEN
resfd (ここで、resfd != fd) が参照した終点は、0 より大きい qlen を持つプロトコル・アドレスにバインドされました。
TSYSERR
この関数の実行時に、システム・エラーが発生しました。

関連情報