標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
z/OS®UNIX | 両方 |
#define _OPEN_SYS_SOCK_EXT2
#include <sys/socket.h>
int accept_and_recv(int socket, int *accept_socket,
struct sockaddr *remote_address,
socklen_t *remote_address_len,
struct sockaddr *local_address,
socklen_t *local_address_len,
void *buffer, size_t buffer_len);
accept_and_recv() 関数は、保留状態の接続のキューにある最初の接続 を抽出します。この関数は、指定したソケットを再使用する か (*accept_socket が -1 でない場合)、または listen ソケットと同じ ソケット・タイプ、プロトコル、およびアドレス・ファミリーで新しいソケット を作成します (*accept_socket が -1 の場合)。この関数は、その後、ピアで送信されたデータの最初のブロックを戻し、接続に関連したローカルおよびリモート・ソケット・アドレスを戻します。
*accept_socket に対する -1 の値は、受け入れ側ソケットが、システムによって割り当てられる必要があり、このパラメーターのアプリケーションに戻される必要があることを意味します。accept_and_recv() の最初の呼び出しで -1 を使用することをお勧めします。詳細は、使用上の注意を参照してください。
*accept_socket が -1 でない場合、着信接続 は、*accept_socket によって指定したソケットで受け入れられます。システムは、異なるソケットを再使用することもできます。この場合、システムは、実際に再使用されるソケットを反映する よう *accept_socket を変更します。
remote_address が NULL ポインターでない場合 は、受け入れられる接続に対するピアのアドレスは、remote_address が 指す sockaddr 構造体に保管され、このアドレスの長さ は、remote_address_len が指すオブジェクトに保管されます。提供されたソケット・アドレス構造体の長さよりもアドレスの実際の長さ のほうが長い場合、アドレスは切り捨てられて保管されます。
local_address が NULL ポインターでない場合 は、この接続に関連したローカル・ソケットのアドレス は、local_address が指す sockaddr 構造体に保管され、このアドレスの長さは、local_address_len が指すオブジェクトに 保管されます。提供されたソケット・アドレス構造体の長さよりもアドレスの実際の長さ のほうが長い場合、アドレスは切り捨てられて保管されます。
この関数の場合、非ブロック化モードはサポートされません。O_NONBLOCK をソケット・ファイル記述子に設定すると、この関数は -1 で戻り、errno が EOPNOTSUPP に設定されます。
listen キューに接続要求がないと、着信接続が受信されるまで、accept_and_recv() は、戻らなくなります。
buffer が NULL でない場合、接続のデータの最初のブロックが受信されるまで、accept_and_recv は戻りません。buffer が NULL の場合、接続が確立した後に、accept_and_recv() は 0 を戻します。
accept_and_recv() 関数によってもたらされるパフォーマンス向上を十分 に利用するには、親がループ内で受け入れて子プロセス・スレッドをスピンオフ するモデルとは異なるプロセス/スレッド・モデルが必要です。親/プロセス・スレッドは除去されます。複数のワーカー・プロセス/スレッドが作成され、各ワーカー・ プロセス/スレッドは、accept_and_recv() 関数をループ内で実行します。accept_and_recv() のパフォーマンス上の利点として、バッファー・コピー が少なくなること、ソケットがリサイクルされること、スケジューリングが最適に なることなどが挙げられます。
正常に実行された場合、accept_and_recv() は、buffer 引数が指すバッファーに保管されたバイト数 (0 以上) を戻します。0 は、バッファーが NULL、またはクライアントがデータを送信せずにソケットを閉じたときに戻されます。
部分的な正常終了になると、*accept_socket が割り当てられ、戻り値は -1 に、errno が以下のいずれかの値に設定されます。
正常に実行されなかった場合、accept_and_recv() は *accepted_socket を -1 に設定し、-1 を戻し、errno を以下のいずれかの値に設定します。