Mar*_*rik 3 asynchronous connect visual-c++ windows-7
我想在Windows7上使用ConnectEx功能,使用MSVC2010.
我收到错误C3861:'ConnectEx':找不到标识符
MSDN建议该函数应该在mswsock.h中声明,但是,在检查它时,它没有在那里定义.
有小费吗?
如果您进一步阅读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()(它确实有一个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);