ConnectEx在哪里定义?

时间:2012-06-10 09:05:14

标签: visual-c++ windows-7 asynchronous connect

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

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

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

任何提示?

1 个答案:

答案 0 :(得分:8)

如果你进一步阅读你提到的the MSDN article for ConnectEx(),它会说:

  

注意必须获取 ConnectEx 功能的功能指针   在运行时通过调用WSAIoctl函数调用   指定了 SIO_GET_EXTENSION_FUNCTION_POINTER 操作码。输入缓冲区   传递给WSAIoctl函数必须包含 WSAID_CONNECTEX ,a   全局唯一标识符(GUID),其值标识 ConnectEx   扩展功能。成功时, WSAIoctl 返回的输出   function包含指向 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);