accept

accept関数は、外部からの接続試行を許可します。

int accept(
    SOCKET s,
    struct sockaddr *addr,
    int *addrlen
);

WS2_32.DLL

引数

s

listen関数でリスン状態となっているソケットを識別するディスクリプタを指定します。

addr

通信層によって認識されている、接続中エントリのアドレスを受け取るバッファへのポインタを任意で指定します。addrパラメータの実際のフォーマットはsockaddr構造体からソケットが作成された時に指定されたアドレスファミリにより決定されます。

addrlen

addrパラメータが指す構造体の長さを含む整数へのポインタを任意で指定します。

戻り値

成功すると、新しいソケットのディスクリプタであるSOCKET型の値を返します。この戻り値は実際のコネクションが作成されたソケットへのハンドルです。

失敗すると-1 (INVALID_SOCKET) を返します。特定のエラーコードを取得するにはWSAGetLastError関数を呼び出します。

addrlenが参照する整数にはあらかじめaddrが刺す領域のサイズを格納します。関数が制御を返すと、取得されたアドレスの実際の長さ(バイト単位)が格納されます。

10004 (WSAEINTR)

(ブロッキング)Windows Sockets 1.1呼び出しがWSACancelBlockingCallによりキャンセルされました。

10014 (WSAEFAULT)

addrlenパラメータの値が小さすぎるか、addrが有効なユーザアドレス空間の一部ではありません。

10024 (WSAEMFILE)

acceptのエントリのキューは空ではありませんが、利用可能なソケットディスクリプタがありません。

10035 (WSAEWOULDBLOCK)

ソケットが非ブロッキングとしてマークされていますが、受け入れ待ちの接続がありません。

10036 (WSAEINPROGRESS)

ブロッキングWindows Sockets 1.1呼び出しが実行中であるか、サービスプロバイダがコールバック関数を実行中です。

10038 (WSAENOTSOCK)

指定されたディスクリプタはソケットではありません。

10045 (WSAEOPNOTSUPP)

参照されたソケットはコネクション指向サービスをサポートしているタイプのソケットではありません。

10050 (WSAENETDOWN)

ネットワークサブシステムが失敗しました。

10054 ()

外部からの接続が示されましたが、その後、呼び出しが受け入れられるよりも前にリモート側のピアが接続を終了しました。

10055 (WSAENOBUFS)

利用可能なバッファ空間がありません。

10093 (WSANOTINITIALISED)

この関数を呼び出す前にWSAStartup関数の呼び出しが成功していなければなりません。

解説

accept関数はソケットsで待機中接続キューの最初の接続を取り出します。そして新しいソケットのハンドルを作成して返します。新たに作成されたソケットは実際の接続を操作するソケットです。このソケットは、元のソケットsと同じ特性(WSAEventSelectまたはWSAEventSelect関数で登録される非同期イベントも含む)を持ちます。

accept関数は、受け入れ待ち状態の接続がキューに存在しない場合には、接続があるまで呼び出し元をブロックする可能性があります。ソケットが非ブロッキングであり、キューに受け入れ待ち接続が存在しない場合には、acceptは以下に示すようにエラーを返します。acceptの正常完了によって新しいソケットハンドルが返された後、受け入れられたソケットをさらに接続を受け入れるために使用することはできません。元のソケットがオープン状態のままとなり、新しい接続要求を待機します。

addrパラメータは、通信層が認識する接続中エントリのアドレスを格納する出力用パラメータです。addrパラメータの実際のフォーマットは通信を行っているアドレスファミリにより決定されます。addrlenは入出力両用のパラメータで、呼び出し時にaddrが刺すバッファのサイズを格納しておく必要があります。呼び出しから制御が返されると、addrに返されたアドレスの実際のサイズがバイト単位で格納されています。

accept関数は、SOCK_STREAMのようなコネクション指向ソケット型で使用されます。addraddrlenのいずれか一方、または両方が0 (NULL) である場合は、受け入れるソケットのリモートアドレスに関する情報は返されません。

Note: acceptなどのブロッキングWinsock関数を呼び出す場合、Winsockは呼び出しが完了する前にネットワークイベントの待機を必要とする場合があります。そのような状況ではWinsockはアラート可能な待機を行いますが、この待機中に、同じスレッドでスケジューリングされている非同期プロシージャコール(APC)による割り込み処理が行われる可能性があります。あるブロッキングWinsock呼び出し中にAPC割り込みが発生し、その中で別のブロッキングWinsock呼び出しを行うと未定義の動作を引き起こします。そのため、Winsockクライアントはこのような呼び出しをしようとしてはいけません。

ATMに関する注意

Windows Sockets 2で非同期転送モード(ATM)を使用する際に留意しておかなければならない、接続設定に関する重要な事項を以下に記載します。