listen
更新日2006年12月03日
参照 http://msdn2.microsoft.com/en-us/library/ms739168.aspx

機能
listen 関数は、接続要求受け入れ用ステートをソケットに関連付けます。

書式
int listen(
  SOCKET s,
  int backlog
);
引数
s [入] バインドされている、接続していない、ソケット識別子。
backlog [入] 未定の接続のキューの最大長。 もし SOMAXCONN がセットされているならば、 ソケット s のために責任を負う基礎をなすサービスプロバイダは、 最大限合理的な値に backlog をセットするでしょう。 実際の backlog 値を獲得する標準的な供給がありません。
戻り値
もしエラーが発生しないならば、listen はゼロを戻します。 さもなくば、SOCKET_ERROR 値を戻します。 そして、特定のエラーコードは WSAGetLastError 呼び出しによって検索出来ます。

エラーコード 意味
WSANOTINITIALISED
この関数を使用するまでに、WSAStartup 呼び出しを成功させておかなければなりません。
WSAENETDOWN
ネットワークサブシステムは失敗しました。
WSAEADDRINUSE
ソケットのローカルアドレスはすでに使用中です、そして、ソケットは SO_REUSEADDR でアドレス再利用を許すためにマークされませんでした。 このエラーは、通常 bind 関数が実行中に発生します、 しかし、この関数までの間遅れる事が出来ました、 もし bind が部分的なワイルドカードアドレス(ADDR_ANY を含んで)であったならば、 そして、もし 特定のアドレスがこちらの関数の持ち時間内コミットを必要をするならば。
WSAEINPROGRESS
Windows Sockets 1.1 が呼び出すブロッキングは、進行中です。 または、サービスプロバイダはコールバック関数をまだ処理中です。
WSAEINVAL
ソケットは、bind で関連付けられませんでした。
WSAEISCONN
ソケットは、既に接続されています。
WSAEMFILE
これ以上、ソケット記述子は利用出来ません。
WSAENOBUFS
バッファ空間が利用出来ません。
WSAENOTSOCK
記述子はソケットではありません。
WSAEOPNOTSUPP
参照されたソケットは、listen 操作をサポートしている型ではありません。

注釈

接続を受け入れます、 ソケットは、最初に socket 関数で作成されて、bind 関数でローカルアドレスに密接に結びつきます、 入ってくる接続用の backlog はlisten と共に指定されます、 そして、それから、接続は accept 関数で受け入れられます。 接続志向であるソケット、 たとえばタイプ SOCK_STREAM のそれら、 listen と共に使用されます。 ソケット s は、入ってくる接続要求が認められて、プロセスによって待ち行列に受け入れられると、 パッシブモードとして置かれます。

listen 関数は、同時に複数の接続要求を出来るサーバにより典型的に用いられます。 もし接続要求が届き、そして、キューが一杯であるならば、 クライアントは WSAECONNREFUSED の指示と共にエラーを受け取るでしょう。

もしソケット記述子が利用可能ではないならば、listen は、関数を続けようとします。 もし記述子が利用可能になるならば、 listen または accept への呼出し後は、 カレント または ごく最近の backlog にキューを補充するでしょう、 もし出来れば、そして、入ってくる接続のために聞き耳を立てる事を再開します。

もし listen が既に聞き取り中であるソケット上において呼ばれるならば、 それは、backlog 変更とは別に成功を戻すでしょう。 聞き取り中ソケット上において、次の listen 呼び出し内にて backlog を 0 にセッティングする事は、 作法通りのリセットであるとは良く考えられません、 特にもしソケットに接続があるならば。


Example Code
以下の例は、listen 関数の使用を示します。 [winsock2listen_example1.c]
/*
 * file:winsock2listen_example1.c
 * The listen function places a socket in a state in which it is listening for an incoming connection.
 * 参照 http://msdn2.microsoft.com/en-us/library/ms739168.aspx
 */
#include <stdio.h>
#include "winsock2.h"

int main()
{
    /*
     * 変数の宣言。
     */
    WSADATA wsaData;
    int iResult = 0;
    SOCKET ListenSocket;
    struct sockaddr_in service;

    /*
     * Winsockの初期化。
     */
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR)
    {
        printf("Error at WSAStartup()\n");
        return 0;
    }

    /*
     * 接続要求受入用のリスニング用のソケットを作成。
     */
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET)
    {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return 0;
    }

    /*
     * そのsockaddr_in構造体はそのアドレスファミリィを指定する、
     * IPアドレス、そして、結びつけられているソケットのためのポート。
     */
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr("127.0.0.1");
    service.sin_port = htons(27015);

    /*
     * ソケットをバインドする。
     */
    if (bind(ListenSocket, (SOCKADDR*)&service, sizeof(service))
            == SOCKET_ERROR)
    {
        printf("bind() failed.\n");
        closesocket(ListenSocket);
        WSACleanup();
        return 0;
    }

    /*
     * 作成されたソケット上にて、
     * 接続要求受け入れ用のリッスンをします。
     */
    if (listen(ListenSocket, 1) == SOCKET_ERROR)
    {
        printf("Error listening on socket.\n");
    }

    printf("Listening on socket...\n");
    WSACleanup();
    return 0;
}

Example Code
listen 関数を使用するもう一つの例のために、Winsock2事始めを見て下さい。

IrDA ソケットのためのノート
  • Af_irda.h ヘッダファイルは明示的にインクルードされなければなりません。

互換性
基礎をなすサービスプロバイダによって決定されるとして、 backlog パラメータは合理的な値に制限されます(黙って)。 不正な値は、最も近い正当値により置き換えられます。 標準的な供給が、実際の backlog 値を発見するためにありません。

要求環境
Client Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
Server Requires Windows Server "Longhorn", Windows Server 2003, Windows 2000 Server, or Windows NT Server.
Header Declared in Winsock2.h.
Library Use libws2_32.a
DLL Requires Ws2_32.dll.

参照
Winsock Reference
Winsock関数
accept
connect
socket