send_file サブルーチン

目的

ソケットを介してファイルの内容を送信します。

ライブラリー

標準 C ライブラリー (libc.a)

構文

#include < sys/socket.h >

ssize_t send_file(Socket_p, sf_iobuf, flags)

int * Socket_p;
struct sf_parms * sf_iobuf;
uint_t  flags;

説明

送信ファイル サブルーチンは、 Socket_p (S) パラメーターが指す接続ソケットを介して、 SF_IOBUF パラメーターで指定されたオープン・ファイルからデータを送信します。

注: 現在、 送信ファイル は TCP/IP プロトコル (AF_INET の SOCK_STREAM ソケット) のみをサポートします。 この関数が他のタイプのソケットで使用されると、エラーが戻されます。

パラメーター

項目 説明
Socket_p (S) ファイルが送信される先のソケットのソケット記述子を指します。
注: これは、ほとんどのソケット関数とは異なります。
SF_IOBUF 以下のように定義された SF_PARM 構造体を指します。
/*
 * Structure for the send_file system call
 */
#ifdef __64BIT__
#define SF_INT64(x)     int64_t x;
#define SF_UINT64(x)    uint64_t x;
#else
#ifdef _LONG_LONG
#define SF_INT64(x)     int64_t x;
#define SF_UINT64(x)    uint64_t x;
#else
#define SF_INT64(x)     int filler_##x; int x;
#define SF_UINT64(x)    int filler_##x; uint_t x;
#endif
#endif

struct sf_parms {
    /* --------- header parms ---------- */
    void      *header_data;         /* Input/Output. Points to header buf */
    uint_t      header_length;      /* Input/Output. Length of the header */
    /* --------- file parms ------------ */
    int       file_descriptor;      /* Input. File descriptor of the file */
    SF_UINT64(file_size)            /* Output. Size of the file */
    SF_UINT64(file_offset)          /* Input/Output. Starting offset */
    SF_INT64(file_bytes)            /* Input/Output. number of bytes to send */
    /* --------- trailer parms --------- */
   void      *trailer_data;         /* Input/Output. Points to trailer buf */
   uint_t    trailer_length;        /* Input/Output. Length of the trailer */
    /* --------- return info ----------- */
    SF_UINT64(bytes_sent)           /* Output. number of bytes sent */
};
ヘッダー・データ
ファイル・データの前に送信されるヘッダー・データを含むバッファーを指します。 ヘッダーの長さ が 0 の場合は、NULL ポインターになることがあります。 このフィールドは、ヘッダーの送信時に 送信ファイル によって更新されます。つまり、以下のようになります。header_data+ 送信されたヘッダーのバイト数。
ヘッダーの長さ
ヘッダー・データ内のバイト数を指定します。 ヘッダー・データを送信しないことを示すには、このフィールドを 0 に設定する必要があります。 このフィールドは、ヘッダーの送信時に 送信ファイル によって更新されます。つまり、以下のようになります。header_length-送信されたヘッダーのバイト数。
File_descriptor
オープンされ、読み取り可能なファイルのファイル記述子を指定します。 これは、送信されるデータが入っているファイルの記述子です。 ファイル・バイト = 0 の場合、 ファイル記述子 は無視されます。 このフィールドは 送信ファイルによって更新されません。
file_size
ファイル記述子で指定されたファイルのバイト・サイズが入っています。 このフィールドはカーネルによって埋められます。
File_offset
データ送信を開始するファイルへのバイト・オフセットを指定します。 このフィールドは、ファイル・データの送信時に 送信ファイル によって更新されます。つまり、以下のようになります。file_offset+ 送信されたファイル・データのバイト数。
File_bytes
送信されるファイルからバイト数を指定します。 file_bytesを -11に設定すると、file_offsetからファイル全体を送信する。 このフィールドが-11に設定されていない場合、ファイル・データが送信されるときにsend_fileによって更新される、file_bytes-送信されたファイル・データのバイト数。
トレーラー・データ
ファイル・データの後に送信されるトレーラー・データが入っているバッファーを指します。 トレーラーの長さ が 0 の場合は、NULL ポインターになることがあります。 このフィールドは、トレーラーの送信時に 送信ファイル によって更新されます。つまり、trailer_data+ 送信されたトレーラーのバイト数。
トレーラーの長さ
トレーラー・データ内のバイト数を指定します。 トレーラー・データを送信しないことを示すには、このフィールドを 0 に設定する必要があります。 このフィールドは、トレーラーの送信時に 送信ファイル によって更新されます。つまり、trailer_length-送信されたトレーラーのバイト数。
Bytes_sent
この呼び出しで 送信ファイルに実際に送信されたバイト数が含まれます。 このフィールドはカーネルによって埋められます。

マークされたすべてのフィールドInputSF_PARM 構造では、 送信ファイル 呼び出しの前にアプリケーションによってセットアップする必要があります。 マークされたすべてのフィールドOutputSF_PARM 構造内のデータが正常に伝送されると、 送信ファイル によって調整されます。つまり、指定されたデータ伝送が部分的に行われるか、完全に行われます。

送信ファイル サブルーチンは、 ヘッダー・データが指すバッファーから ヘッダーの長さ バイトを書き込もうとします。その後に、 ファイル記述子に関連付けられたファイルから ファイル・バイト が続き、その後に、 Socket_p (S)が指すソケットに関連付けられた接続を介して、 トレーラー・データが指すバッファーから トレーラーの長さ バイトが続きます。

データが送信されると、カーネルは SF_IOBUF が指すパラメーターを更新します。これにより、ファイル・データ伝送を完了するために 送信ファイル を複数回呼び出す必要がある場合 (シグナルによる割り込みまたは非ブロッキング入出力モードのいずれかの理由で)、アプリケーションはパラメーターを設定したり再調整したりせずに 送信ファイル コマンドを再発行することができます。

アプリケーションがfile_offsetを実際のファイル・サイズより大きく設定した場合、またはfile_bytesを(実際のファイル・サイズ-file_offset)より大きく設定した場合、戻り値は-1、errnoはEINVALとなる。

flags 以下の属性を指定します。
SF_CLOSE
データが正常に送信された後、または伝送のためにキューに入れられた後で、 Socket_p (S) が指すソケットをクローズします。
SF_REUSE
データが正常に送信されるか、伝送のためにキューに入れられ、既存の接続がクローズされた後で、ソケットを再利用できるように準備します。
注: このオプションは現在、このオペレーティング・システムではサポートされていません。
SF_DONT_キャッシュ
指定されたファイルをネットワーク・バッファー・キャッシュに入れません。
SF_SYNC_キャッシュ
指定されたファイルのネットワーク・バッファー・キャッシュを伝送前に検査/更新します。

SF クローズ フラグが設定されている場合、 Socket_p (S) によって指定された接続されたソケットは、要求された伝送が正常に行われた後、 送信ファイル によって切断され、クローズされます。 Socket_pが指すソケットディスクリプタには-1設定される。 send_fileが non-0を返した場合、このフラグは有効にならない。

SF_REUSEフラグは現在AIX® ではサポートされていない。このフラグを指定すると、Socket_pが指すソケットはクローズされ、-1返される。 次の接続のために新規ソケットを作成する必要があります。

送信ファイル は、カーネル・メモリー内のネットワーク・バッファー・キャッシュを利用して、出力ファイル・データを動的にキャッシュします。 これにより、以下のようなファイルの 送信ファイル パフォーマンスを向上させることができます。

  1. ネットワークを介して繰り返しアクセスされる
  2. 頻繁には変更されません

アプリケーションは、 SF_DONT_キャッシュ フラグを使用して、指定されたファイルをキャッシュから除外することができます。 送信ファイル は、キャッシュ内のファイル・データが一定期間有効であることを確認するために、頻繁にキャッシュを更新します。 いいえ コマンドによって制御されるネットワーク・オプション・パラメーター「send_file_duration」を変更して、 送信ファイル キャッシュ検証の間隔を構成することができます。デフォルトは 300 (秒) です。 アプリケーションは SF_SYNC_キャッシュ フラグを使用して、「send_file_duration」の値に関係なく、 送信ファイルによってファイルが送信される前に、指定されたファイルのキャッシュ妥当性検査が行われるようにすることができます。 その他のネットワーク・バッファー・キャッシュ関連パラメーターは、「nbc_limit」、「nbc_max_cache」、および「nbc_min_cache」です。 その他の情報については、 いいえ コマンドを参照してください。

戻り値

送信ファイルから返される可能性がある戻り値は、以下の 3 つです。

説明
-1 エラーが発生しました。errno にエラー・コードが含まれています。
0 コマンドは、正常に完了しました。
1 コマンドが部分的に完了し、一部のデータが送信されましたが、何らかの理由 (例えば、コマンドがシグナルによって中断されたなど) でコマンドが戻らなければなりません。

マークされたフィールドOutput戻り値が 0 または 1 の場合、 SF_PARM 構造体 ( SF_IOBUFによって指し示される) 内の値が 送信ファイル によって更新されます。 送信バイト数 フィールドには、この呼び出しで送信された合計バイト数が含まれます。 これは常に、 送信バイト数 (Output) <= ヘッダーの長さ(Input) + ファイル・バイト(Input) + トレーラーの長さ (Input).

送信ファイル は、ブロッキング入出力モードおよび非ブロッキング入出力モードをサポートします。 ブロッキング入出力モードでは、 送信ファイル は、すべてのファイル・データ (およびヘッダーとトレーラー) が送信されるまでブロックします。 伝送結果を反映するように SF_IOBUF を調整し、0 を返します。 要求が完全に実行される前に 送信ファイル が中断される可能性があります。その場合、は伝送の進行状況を反映するように SF_IOBUF を調整し、1 を返します。

非ブロッキング入出力モードでは、 送信ファイル は、ソケット・スペースが許可する量だけ伝送し、伝送の進行状況を反映するように SF_IOBUF を調整し、0 または 1 のいずれかを戻します。 システムにデータをバッファするためのソケットスペースがない場合、send_fileは-1を返し、 errno に EWOULDBLOCK をセットする。 選択 または 投票 を使用して、より多くのデータを送信できる時期を判別することができます。

戻された可能性のある errno:
EBADF ソケットまたはファイル・ディスクリプター・パラメーターのいずれかが無効です。
ENOTSOCK ソケット・パラメーターは、ソケットではなくファイルを参照します。
EPROTONOSUPPORT サポートされていないプロトコルです。
EFAULT HeaderTailer パラメーターで指定されたアドレスは、ユーザー・アドレス・スペースの書き込み可能部分に含まれていません。
EINTR データが送信される前に、操作がシグナルによって割り込まれました。 (一部のデータが送信された場合、 送信ファイル はシグナルの前に送信されたバイト数を戻し、EINTR は設定されません。)
EINVAL オフセット、HeaderTrailer,の長さ、または flags パラメータが無効です。
ENOTCONN 接続されていないソケット上の 送信ファイル 、ピアとの接続シーケンスを完了していないソケット上の 送信ファイル 、またはピアに接続されていないソケット上の。
EWOULDBLOCK ソケットは非ブロッキングとしてマークされ、要求された操作はブロックされます。
ENOMEM 操作を実行するために使用可能なメモリーがシステムにありません。

PerformanceNote

ネットワーク・バッファー・キャッシュを利用することにより、 送信ファイル はファイル伝送のパフォーマンスとネットワーク・スループットを向上させます。 4K バイトより大きいファイルの場合に推奨されます。