WSAEnumNetworkEvents 関数 (winsock2.h)

WSAEnumNetworkEvents 関数は、指定されたソケットのネットワーク イベントの発生を検出し、内部ネットワーク イベント レコードをクリアし、イベント オブジェクトをリセットします (省略可能)。

構文

int WSAAPI WSAEnumNetworkEvents(
  [in]  SOCKET             s,
  [in]  WSAEVENT           hEventObject,
  [out] LPWSANETWORKEVENTS lpNetworkEvents
);

パラメーター

[in] s

ソケットを識別する記述子。

[in] hEventObject

リセットする関連付けられたイベント オブジェクトを識別する省略可能なハンドル。

[out] lpNetworkEvents

発生したネットワーク イベントと関連するエラー コードのレコードが格納された WSANETWORKEVENTS 構造体へのポインター。

戻り値

操作が成功した場合、戻り値は 0 です。 それ以外の場合は、SOCKET_ERROR値が返され、 WSAGetLastError を呼び出すことによって特定のエラー番号を取得できます。

エラー コード 意味
WSANOTINITIALIZED
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEINVAL
指定されたパラメーターの 1 つが無効です。
WSAEINPROGRESS
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAENOTSOCK
記述子はソケットではありません。
WSAEFAULT
lpNetworkEvents パラメーターは、ユーザー アドレス空間の有効な部分ではありません。

注釈

WSAEnumNetworkEvents 関数は、この関数の最後の呼び出し以降に指定されたソケットで発生したネットワーク イベントを検出するために使用されます。 これは、イベント オブジェクトを 1 つ以上のネットワーク イベントに関連付ける WSAEventSelect と組み合わせて使用することを目的としています。 ネットワーク イベントの記録は、WSAEventSelect が 0 以外の lNetworkEvents パラメーターを使用して呼び出され、lNetworkEvents パラメーターが 0 に設定された WSAEventSelect に対して別の呼び出しが行われるまで、または WSAAsyncSelect の呼び出しが行われるまで有効なままです。

WSAEnumNetworkEvents は、WSAEventSelect によって指定されたネットワーク アクティビティとエラーのみを報告します。 select WSAAsyncSelect の説明を参照して、これらの関数がネットワーク アクティビティとエラーを報告する方法を確認してください。

ネットワーク イベントのソケットの内部レコードは 、lpNetworkEvents によって参照される構造体にコピーされ、その後、内部ネットワーク イベント レコードがクリアされます。 hEventObject パラメーターが NULL でない場合、指定されたイベント オブジェクトもリセットされます。 Windows ソケット プロバイダーは、ネットワーク イベント レコードのコピー、ネットワーク イベント レコードのクリア、および関連するイベント オブジェクトのリセットの操作がアトミックであることを保証します。これにより、指定されたネットワーク イベントが次に発生すると、イベント オブジェクトが設定されます。 この関数がSOCKET_ERRORを返す場合、関連付けられているイベント オブジェクトはリセットされず、ネットワーク イベントのレコードはクリアされません。

WSANETWORKEVENTS 構造体の lNetworkEvents メンバーは、FD_XXXネットワーク イベントのうち発生したイベントを示します。 iErrorCode 配列は、lNetworkEvents 内のイベント ビットの位置に対応する配列インデックスに関連付けられているエラー コードを格納するために使用されます。 FD_READ_BITやFD_WRITE_BITなどの識別子を使用して 、iErrorCode 配列のインデックスを作成できます。 iErrorCode 配列の要素のみが、lNetworkEvents パラメーターで設定されたビットに対応して設定されることに注意してください。 その他のパラメーターは変更されません (これは、新しいFD_ROUTING_INTERFACE_CHANGEおよびFD_ADDRESS_LIST_CHANGE イベントを認識していないアプリケーションとの下位互換性のために重要です)。

対応するネットワーク イベントと共に、次のエラー コードを返すことができます。

イベント: FD_CONNECT

エラー コード 意味
WSAEAFNOSUPPORT 指定されたファミリーのアドレスをこのソケットと共に使用することはできません。
WSAECONNREFUSED 接続要求は強制的に拒否されました。
WSAENETUNREACH 現在このホストからネットワークには到達できません。
WSAENOBUFS バッファーに空き領域がありません。 ソケットを接続できません。
WSAETIMEDOUT 接続を確立せずに接続しようとするとタイムアウトしました
 

イベント: FD_CLOSE

エラー コード 意味
WSAENETDOWN ネットワーク サブシステムが失敗しました。
WSAECONNRESET リモート側で接続がリセットされました。
WSAECONNABORTED タイムアウトまたはその他のエラーが原因で接続が終了しました。
 

イベント: FD_ACCEPT

イベント: FD_ADDRESS_LIST_CHANGE

イベント: FD_GROUP_QOS

イベント: FD_QOS

イベント: FD_OOB

イベント: FD_READ

イベント: FD_WRITE

エラー コード 意味
WSAENETDOWN ネットワーク サブシステムが失敗しました。
 

イベント: FD_ROUTING_INTERFACE_CHANGE

エラー コード 意味
WSAENETUNREACH 指定された宛先に到達できなくなりました。
WSAENETDOWN ネットワーク サブシステムが失敗しました。
 

コード例

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

#define WIN32_LEAN_AND_MEAN

#include <windows.h>

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

// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

int main()
{
//-------------------------
// Declare and initialize variables
    WSADATA wsaData;
    int iResult;

    SOCKET SocketArray[WSA_MAXIMUM_WAIT_EVENTS], ListenSocket;
    WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS];
    WSANETWORKEVENTS NetworkEvents;
    sockaddr_in InetAddr;
    DWORD EventTotal = 0;
    DWORD Index;
    DWORD i;
    
    HANDLE NewEvent = NULL; 

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

//-------------------------
// Create a listening socket
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %d\n", WSAGetLastError() );
        return 1;
    }
    
    InetAddr.sin_family = AF_INET;
    InetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    InetAddr.sin_port = htons(27015);

//-------------------------
// Bind the listening socket
    iResult = bind(ListenSocket, (SOCKADDR *) & InetAddr, sizeof (InetAddr));
    if (iResult != 0) {
        wprintf(L"bind failed with error: %d\n", WSAGetLastError() );
        return 1;
    }

//-------------------------
// Create a new event
    NewEvent = WSACreateEvent();
    if (NewEvent == NULL) {
        wprintf(L"WSACreateEvent failed with error: %d\n", GetLastError() );
        return 1;
    }    

//-------------------------
// Associate event types FD_ACCEPT and FD_CLOSE
// with the listening socket and NewEvent
    iResult = WSAEventSelect(ListenSocket, NewEvent, FD_ACCEPT | FD_CLOSE);
    if (iResult != 0) {
        wprintf(L"WSAEventSelect failed with error: %d\n", WSAGetLastError() );
        return 1;
    }

//-------------------------
// Start listening on the socket
    iResult = listen(ListenSocket, 10);
    if (iResult != 0) {
        wprintf(L"listen failed with error: %d\n", WSAGetLastError() );
        return 1;
    }

//-------------------------
// Add the socket and event to the arrays, increment number of events
    SocketArray[EventTotal] = ListenSocket;
    EventArray[EventTotal] = NewEvent;
    EventTotal++;

//-------------------------
// Wait for network events on all sockets
    Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE);
    Index = Index - WSA_WAIT_EVENT_0;

//-------------------------
// Iterate through all events and enumerate
// if the wait does not fail.
    for (i = Index; i < EventTotal; i++) {
        Index = WSAWaitForMultipleEvents(1, &EventArray[i], TRUE, 1000, FALSE);
        if ((Index != WSA_WAIT_FAILED) && (Index != WSA_WAIT_TIMEOUT)) {
            WSAEnumNetworkEvents(SocketArray[i], EventArray[i], &NetworkEvents);
        }
    }

//...
    return 0;


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

こちらもご覧ください

WSAEventSelect

Winsock 関数

Winsock リファレンス