listen

listen関数は、外部からのコネクションを待機するためにソケットをリスン状態にします。

int listen(
    SOCKET s,
    int    backlog
);

WS2_32.DLL

引数

s

未接続のソケットを識別するディスクリプタを指定します。

backlog

待機中の接続を保持するキューの最大長を指定します。SOMAXCONN(Windows Sockets 2では0x7fffffff)に設定すると、ソケットsに関与する下層のサービスプロバイダがバックログを妥当な最大値に設定します。実際のバックログ値を取得する標準的な規定はありません。

戻り値

成功すると0を返します。

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

10022 (WSAEINVAL)

パラメータsbind関数でバインドされていません。

10024 (WSAEMFILE)

これ以上のソケットディスクリプタを使用することはできません。

10036 (WSAEINPROGRESS)

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

10038 (WSAENOTSOCK)

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

10045 (WSAEOPNOTSUPP)

参照されたソケットはlisten操作をサポートしているタイプのソケットではありません。

10048 (WSAEADDRINUSE)

ソケットのローカルアドレスが既に使用されており、ソケットがアドレスを再利用可能となるようにSO_REUSEADDRソケットオプションが付けられていません。このエラーは通常bind関数を実行している際に発生しますが、bindが部分的なワイルドカードアドレス(ADDR_ANYを含む)を指定し、かつ、特定のアドレスがこの関数の時点でコミットされる必要がある場合にこの関数まで先延ばしされる可能性があります。

10050 (WSAENETDOWN)

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

10055 (WSAENOBUFS)

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

10056 (WSAEISCONN)

指定されたソケットはすでに接続されています(コネクション指向のソケットのみ)。

10093 (WSANOTINITIALISED)

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

解説

接続を受け入れるには、まずsocket関数でソケットを作成し、bind関数でソケットをローカルアドレスにバインドします。listenで外部からの接続のバックログを指定し、accept関数で外部からの接続を受け入れます。listen関数はコネクション指向のソケット(例えばソケットタイプがSOCK_STREAM)で使用されます。ソケットsは受動モードとなります。このモードでは、外部からの接続要求がある場合は肯定応答を返し、プロセスにより接続が受け入れられるまでキューに格納します。

backlogに指定されるSOMAXCONNは、ソケットsに関与する下層のサービスプロバイダに待機中接続キューの長さを妥当な最大値に設定するように指示する特殊な定数です。

Windows Sockets 2では、最大値は大きな値(一般に数百以上)がデフォルト値として設定されています。Bluetoothアプリケーションでlisten関数を呼び出す場合、受け入れられるクライアントはわずかな数なので、backlogパラメータにを十分に小さい値(一般には2から4)にすることが強く推奨されます。これにより、リスニングソケットに使用するために割り当てられるシステムリソースが軽減されます。同様に、わずかな数のクライアントからしか接続されないと期待されるネットワークアプリケーションにおいても、小さい値を指定することが推奨されます。

呼び出しが正常に成功すると、ソケットはデータの送受信をすることができる状態になります。nameパラメータで指定された構造体のアドレスのメンバがすべてゼロである場合には、connectはエラーコードWSAEADDRNOTAVAILで失敗します。

一般に、listen関数は同時に複数の接続を行うことのできるサーバで使用されます。接続要求が到着した時にキューがいっぱいである場合には、クライアントはWSAECONNREFUSEDエラーを受け取ります。

利用可能なソケットディスクリプタがない場合、listen関数は動作を継続しようと試みます。ディスクリプタが利用可能になった場合、後のlistenまたはaccept呼び出しで、可能であれば現在のまたは最も新しいbacklog値にキューを補充し、外部からの接続要求の待機を再開します。

listen関数がすでにリスン中のソケット対して呼び出されると、関数を成功を返しますが、backlogパラメータの値は変更されません。リスニングソケットに対して再度listenを呼び出してbacklogパラメータの値を0に設定することは、特にソケットにコネクションが存在する場合には、適切な初期化方法ではありません。

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

IrDAソケットに関する注意

互換性

backlogパラメータは下層のサービスプロバイダによって決定される妥当な値に制限されます。無効な値は、もっとも近い有効な範囲の値に置き換えられます。実際のバックログの値を調べる標準的な方法はありません。