t_snd() - 接続によるデータ/優先データの送信

標準

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

形式

#define _XOPEN_SOURCE_EXTENDED 1
#include <xti.h>

int t_snd(int fd, char *buf, unsigned int nbytes, int flags);

機能説明

標準データまたは優先データのいずれかを 受信します。引数 fd はデータが送信される ローカル・トランスポート終点を識別し、buf は ユーザー・データを指し、nbytes は送信される ユーザー・データのバイト数を指定し、さらに flags は 下に述べたオプションのフラグを指定します。
T_EXPEDITED
flags に設定されると、データは優先データとして 送信され、トランスポート提供者の解釈に左右されます。
T_MORE
TCP トランスポート提供者が TSDU の概念をサポートしない ので、T_MORE フラグは無意味で、設定されると無視されます。

デフォルトでは、t_snd() は、同期モードで動作し、呼び出しが行われた時点で、フロー制御制約事項によって、ローカル・トランスポート提供者がデータを受け入れることができない場合には、待機することがあります。しかし、O_NONBLOCK が設定された (t_open() または fcntl() を使用して) 場合には、t_snd() は、非同期モードで実行し、フロー制御制約事項があると即時に失敗します。プロセスは、t_look() または選択 / ポーリングのいずれかを使用して、フロー制御制約事項がクリアされる時点を通知してもらうように、設定できます。

正常に実行された場合、t_snd() はトランスポート提供者が受け入れたバイト数を戻します。通常、これは nbytes に指定されているバイト数と等しくなります。しかし、O_NONBLOCK が設定されると、トランスポート提供者は、実際にデータの一部しか受け入れないという可能性があります。この場合には、t_snd() は、nbytes の値より小さい値を戻します。

各 TSDU または ETSDU のサイズは、t_getinfo() によって 戻された info 引数の TSDU または ETSDU フィールドの 現行値によって指定されたトランスポート提供者の限界を超えないでください。イベント (例えば、切断) が起こったことをプロセスに通知する ために、エラー TLOOK を戻せます。

有効状態: T_DATAXFER

戻り値

正常に実行された場合、t_snd() はトランスポート提供者が受け入れたバイト数を戻します。

非同期モードでは、トランスポート提供者が受け入れたバイト数が 要求されたバイト数より小さい場合には、これはトランスポート提供者がフロー制御のためにブロックされて いることを指示できることに注意してください。

正常に実行されなかった場合、t_snd() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
TBADDATA
無許可のデータ量は次のとおりです。
  • 単一送信が試みられ、info 引数の TSDU または ETSDU フィールドの現行値によって指定されたものより 大きい TSDU (ETSDU) またはフラグメント TSDU (ETSDU) を 指定しました。
  • 複数の送信が試みられ、結果的に info 引数の TSDU または ETSDU フィールドの現行値によって指定されたものより 大きい TSDU (ETSDU) になりました。
TBADF
指定されたファイル記述子は、トランスポート終点を 指していません。
TBADFLAG
無効なフラグが指定されました。
TFLOW
O_NONBLOCK が設定されましたが、フロー制御メカニズムによって トランスポート提供者はこの時点でデータを受け入れることが できませんでした。
TLOOK
このトランスポート終点で非同期イベントが起こりました。
TNOTSUPPORT
この関数は、基礎トランスポート提供者によって サポートされません。
TOUTSTATE
関数は、fd によって参照されたトランスポート終点で 誤ったシーケンスで発行されました。
TPROTO
このエラーは、XTI と他に適切な XTI (t_errno) がない トランスポート提供者の間で通信問題が検出されたことを 示しています。
TSYSERR
この関数の実行時に、システム・エラーが発生しました。

トランスポート提供者が、トランスポート終点のすべてのユーザーを、単一ユーザーとして扱うことを忘れないことが重要です。したがって、複数のプロセスが並行 t_snd() 呼び出しを出した場合には、異なるデータが混合することがあります。TSDU または ETSDU の最大サイズを超える複数の送信が XTI で見つからないことがあります。この場合には、インプリメンテーション依存エラーが、おそらく以降の XTI 呼び出しで発生し (トランスポート提供者によって生成され) ます。このエラーは、接続打ち切りの形式、すなわち、TSYSERRTBADDATA、または TPROTO エラーをとることがあります。TSDU または ETSDU の最大サイズを超える複数の送信が XTI で見つかった場合には、t_snd() は、TBADDATA を使用すると失敗することがあります。

関連情報