2016-07-23 5 views
1

Welche Komponenten sind für registrierte Winsock-E/A erforderlich? Ich verwende Windows 10 und Visual Studio Gemeinschaft 2015 Update3Welche Komponenten werden für registrierte Winsock-E/A-Module benötigt?

MSDN Winsock Include Files ist das einzige, was ich finden kann, und es ist sehr vage.

Dies sind die einzigen Winsock2 umfasst die ich finden kann:

#include <WinSock2.h> 
#include <WS2tcpip.h> 
#include <MSWSock.h> 
#include <WS2spi.h> 
#include <WS2atm.h> 
#include <ws2def.h> 
#include <ws2ipdef.h> 

Leider keiner von ihnen scheinen keine RIO-Funktionen zu definieren:

RIOCreateCompletionQueue() 
RIOCreateRequestQueue() 
//and etc are undefined.. 

Von dem, was ich verstand ab Windows 2012 8.1 zurück diese Funktionen mit dem Windows SDK ausgeliefert?

Antwort

3

von MSDN Zitiert:

RIOCreateCompletionQueue function

Der Funktionszeiger auf die RIOCreateCompletionQueue Funktion muss angegeben, indem sie einen Anruf an die WSAIoctl Funktion mit dem SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER Opcode während der Laufzeit erhalten werden. Der an die Funktion WSAIoctl übergebene Eingabepuffer muss WSAID_MULTIPLE_RIO enthalten, eine global eindeutige Kennung (GUID), deren Wert die registrierten Winsock-E/A-Erweiterungsfunktionen angibt. Bei Erfolg der Ausgang von der WSAIoctl Funktion enthält einen Zeiger auf die RIO_EXTENSION_FUNCTION_TABLE Struktur zurückgegeben wird, die Zeiger auf die Winsock registrierten E/A-Erweiterungsfunktionen enthält. Die SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL ist in der Header-Datei Ws2def.h definiert. Die GUID WSAID_MULTIPLE_RIO ist in der Header-Datei Mswsock.h definiert.

Schauen Sie sich auch this question an. Ein Link von dieser Frage verweist this RIO implementation, das folgende Beispiel enthält (Auszug):

... 

inline void CreateRIOSocket() 
{ 
    g_s = CreateSocket(WSA_FLAG_REGISTERED_IO); 

    Bind(g_s, PORT); 

    InitialiseRIO(g_s); 
} 

inline SOCKET CreateSocket(
    const DWORD flags = 0) 
{ 
    g_s = ::WSASocket(
     AF_INET, 
     SOCK_DGRAM, 
     IPPROTO_UDP, 
     NULL, 
     0, 
     flags); 

    if (g_s == INVALID_SOCKET) 
    { 
     ErrorExit("WSASocket"); 
    } 

    return g_s; 
} 

inline void InitialiseRIO(
    SOCKET s) 
{ 
    GUID functionTableId = WSAID_MULTIPLE_RIO; 

    DWORD dwBytes = 0; 

    bool ok = true; 

    if (0 != WSAIoctl(
     s, 
     SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER, 
     &functionTableId, 
     sizeof(GUID), 
     (void**)&g_rio, 
     sizeof(g_rio), 
     &dwBytes, 
     0, 
     0)) 
    { 
     ErrorExit("WSAIoctl"); 
    } 
} 

... 
+1

Ich verstehe jetzt, ich danke Ihnen sehr +1 – KKlouzal

Verwandte Themen