ConnectEx在哪里定义了?

5

我想在Windows7上使用ConnectEx函数,并且使用MSVC2010。

但是我收到了错误C3861: 'ConnectEx': 标识符未找到。

MSDN建议这个函数应该在mswsock.h中声明,然而,在检查时,它并没有被定义在那里。

有什么提示吗?

1个回答

11
如果您深入阅读了您提到的 MSDN 中关于ConnectEx() 的文章,它会提示:

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

与其他 Windows API 函数不同,需要在运行时加载 ConnectEx(),因为头文件实际上不包含对 ConnectEx() 函数的声明(它确实有一个名为 LPFN_CONNECTEX 的函数的typedef),并且文档没有明确说明必须链接到特定库以使其工作 (这通常适用于其他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);

以下是有关编程的内容以及如何完成此操作的示例代码:http://www.lenholgate.com/blog/2005/05/winsock-connectex-shutdown-so-update-connect-context-and-wsanotconn.html - Roman R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接