listen 関数 (winsock2.h)

listen 関数は、受信接続をリッスンしている状態でソケットを配置します。

構文

int WSAAPI listen(
  [in] SOCKET s,
  [in] int    backlog
);

パラメーター

[in] s

バインドされた接続されていないソケットを識別する記述子。

[in] backlog

保留中の接続のキューの最大長。 SOMAXCONN に設定すると、ソケット s を担当する基になるサービス プロバイダーによってバックログが最大妥当な値に設定されます。 SOMAXCONN_HINT(N) に設定すると (N は数値)、バックログ値は N になり、範囲内 (200、65535) 内に調整されます。 SOMAXCONN_HINTを使用して、SOMAXCONN で可能なよりも大きな値にバックログを設定できることに注意してください。

SOMAXCONN_HINT は、Microsoft TCP/IP サービス プロバイダーでのみサポートされています。 実際のバックログ値を取得するための標準のプロビジョニングはありません。

戻り値

エラーが発生しない場合、 listen は 0 を返します。 それ以外の場合は、 SOCKET_ERROR の値が返され、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。

エラー コード 意味
WSANOTINITIALIZED
この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEADDRINUSE
ソケットのローカル アドレスは既に使用されており、SO_REUSEADDRでアドレスを再利用できるようにソケットがマークされていません。 このエラーは通常、バインド関数の実行中に発生しますが、 バインド が部分的なワイルドカード アドレス (ADDR_ANYを含む) に対して 行われた場合 、およびこの関数の時点で特定のアドレスをコミットする必要がある場合は、この関数まで遅延する可能性があります。
WSAEINPROGRESS
ブロックしている Windows Sockets 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINVAL
ソケットが バインドにバインドされていません。
WSAEISCONN
ソケットは既に接続されています。
WSAEMFILE
これ以上使用できるソケット記述子がありません。
WSAENOBUFS
バッファーに空き領域がありません。
WSAENOTSOCK
記述子はソケットではありません。
WSAEOPNOTSUPP
参照されるソケットは、 リッスン 操作をサポートする型ではありません。

注釈

接続を受け入れるために、ソケットはまず ソケット 関数を使用して作成され、バインド関数を使用してローカル アドレスに バインド されます。 受信接続のバックログは listen で指定され、その接続は accept 関数で 受け入れられます 。 接続指向のソケット (たとえば 、SOCK_STREAM 型のソケット) は、 リッスンと共に使用されます。 ソケット s はパッシブ モードになり、受信接続要求はプロセスによって受信確認され、キューに入れられます。

SOMAXCONNバックログの値は、保留中の接続のキューの長さを最大の妥当な値に設定するように、ソケット s を担当する基になるサービス プロバイダーに指示する特別な定数です。

Windows ソケット 2 では、この最大値の既定値は大きい値 (通常は数百以上) です。

Bluetooth アプリケーションで listen 関数を呼び出す場合は、少数のクライアント接続しか受け入れられないため、 バックログ パラメーター (通常は 2 から 4) に使用することを強くお勧めします。 これにより、リッスン ソケットで使用するために割り当てられるシステム リソースが削減されます。 この同じ推奨事項は、少数のクライアント接続のみを想定する他のネットワーク アプリケーションにも適用されます。

リッスン関数は通常、一度に複数の接続要求を持つサーバーで使用されます。 接続要求が到着し、キューがいっぱいになると、クライアントは WSAECONNREFUSED を示すエラーを受け取ります。

使用可能なソケット記述子がない場合は、 リッスン によって引き続き機能が試行されます。 記述子が使用可能になった場合、 リッスン または 受け入れるため の後の呼び出しでは、 可能であれば、backlog パラメーターに指定された現在または最新の値にキューが補充され、受信接続のリッスンが再開されます。

既にリッスンしているソケットで listen 関数が呼び出されると、 backlog パラメーターの値を変更せずに成功を返します。 リッスンしているソケットでリッスンする後続の呼び出しで backlog パラメーターを 0 に設定しても、ソケットに接続がある場合は特に、適切なリセットとは見なされません。

メモリッスンなどのブロッキング Winsock 呼び出しを発行する場合、Winsock は、呼び出しを完了する前にネットワーク イベントを待機する必要がある場合があります。 Winsock は、この状況でアラート可能な待機を実行します。この待機は、同じスレッドでスケジュールされた非同期プロシージャ 呼び出し (APC) によって中断される可能性があります。 同じスレッドで進行中の Winsock 呼び出しを中断した APC 内で別のブロック Winsock 呼び出しを発行すると、未定義の動作が発生し、Winsock クライアントが試行してはなりません。
 

コード例

次の例では、 listen 関数の使用方法を示します。
#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")

int wmain()
{

    //----------------------
    // Initialize Winsock
    WSADATA wsaData;
    int iResult = 0;

    SOCKET ListenSocket = INVALID_SOCKET;
    sockaddr_in service;

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup() failed with error: %d\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for listening for incoming connection requests.
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr("127.0.0.1");
    service.sin_port = htons(27015);

    iResult = bind(ListenSocket, (SOCKADDR *) & service, sizeof (service));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"bind function failed with error %d\n", WSAGetLastError());
        iResult = closesocket(ListenSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // Listen for incoming connection requests 
    // on the created socket
    if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
        wprintf(L"listen function failed with error: %d\n", WSAGetLastError());

    wprintf(L"Listening on socket...\n");

    iResult = closesocket(ListenSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    WSACleanup();
    return 0;
}

コード例

listen 関数を使用する別の例については、「winsock ではじめにする」を参照してください。

IrDA ソケットに関する注意事項

  • Af_irda.h ヘッダー ファイルは明示的に含まれている必要があります。

互換性

backlog パラメーターは、基になるサービス プロバイダーによって決定される妥当な値に制限されます (サイレント)。 無効な値は、最も近い有効な値に置き換えられます。 実際のバックログ値を調べる標準のプロビジョニングはありません。

Windows Phone 8: この関数は、Windows Phone 8 以降の Windows Phone ストア アプリでサポートされています。

Windows 8.1Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。

要件

要件
サポートされている最小のクライアント Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー winsock2.h
Library Ws2_32.lib
[DLL] Ws2_32.dll

こちらもご覧ください

Winsock 関数

Winsock リファレンス

accept

connect

socket