ConnectEx 是在哪里定义的?

问题描述 投票:0回答:1

我想在Windows7上使用ConnectEx功能,使用MSVC2010。

我收到错误 C3861:“ConnectEx”:找不到标识符

MSDN建议该函数应该在mswsock.h中声明,但是,当检查它时,它并没有在那里定义。

有什么建议吗?

asynchronous visual-c++ windows-7
1个回答
11
投票

如果您进一步阅读您提到的ConnectEx()

的MSDN文章,它会说:

注意 必须获取ConnectEx函数的函数指针 在运行时通过使用以下命令调用 WSAIoctl 函数 SIO_GET_EXTENSION_FUNCTION_POINTER 指定操作码。输入缓冲区 传递给 WSAIoctl 函数必须包含 WSAID_CONNECTEX,一个 全局唯一标识符 (GUID),其值标识 ConnectEx 扩展功能。成功时,WSAIoctl 返回的输出 函数包含指向 ConnectEx 函数的指针。这 WSAID_CONNECTEX GUID 在 Mswsock.h 头文件中定义。

与其他 Windows API 函数不同,

ConnectEx()

 必须在运行时加载,因为头文件实际上并不包含 
ConnectEx()
 的函数声明(它确实有一个 
typedef
 表示名为 
LPFN_CONNECTEX
 的函数)并且文档没有具体提及您必须链接到的特定库才能使其工作(其他 Windows API 函数通常是这种情况)。

这是一个如何使其工作的示例(为了说明而省略了错误检查):

#include <Winsock2.h> // Must be included before Mswsock.h #include <Mswsock.h> // Required if you haven't specified this library for the linker yet #pragma comment(lib, "Ws2_32.lib") /* ... */ SOCKET s = /* ... */; DWORD numBytes = 0; GUID guid = WSAID_CONNECTEX; LPFN_CONNECTEX ConnectExPtr = NULL; int success = ::WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, (void*)&guid, sizeof(guid), (void*)&ConnectExPtr, sizeof(ConnectExPtr), &numBytes, NULL, NULL); // Check WSAGetLastError()! /* ... */ // Assuming the pointer isn't NULL, you can call it with the correct parameters. ConnectExPtr(s, name, namelen, lpSendBuffer, dwSendDataLength, lpdwBytesSent, lpOverlapped);
    
© www.soinside.com 2019 - 2024. All rights reserved.