我想在Windows7和MSVC2010上使用ConnectEx函数。
我收到错误C3861:“ConnectEx”:找不到标识符
MSDN建议应在mswsock.h中声明该函数,但是,在检查它时,此处未定义该函数。
有小费吗?
最佳答案
如果您进一步阅读提到的the MSDN article for ConnectEx()
,它说:
注意必须获取Connect的的函数指针函数
在运行时通过调用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);