我想在Windows7上使用ConnectEx函数,并且使用MSVC2010。
但是我收到了错误C3861: 'ConnectEx': 标识符未找到。
MSDN建议这个函数应该在mswsock.h中声明,然而,在检查时,它并没有被定义在那里。
有什么提示吗?
我想在Windows7上使用ConnectEx函数,并且使用MSVC2010。
但是我收到了错误C3861: 'ConnectEx': 标识符未找到。
MSDN建议这个函数应该在mswsock.h中声明,然而,在检查时,它并没有被定义在那里。
有什么提示吗?
ConnectEx()
的文章,它会提示:
与其他 Windows API 函数不同,需要在运行时加载注意 必须通过调用带有SIO_GET_EXTENSION_FUNCTION_POINTER操作码的WSAIoctl函数获取ConnectEx函数的函数指针。传递给 WSAIoctl 函数的输入缓冲区必须包含WSAID_CONNECTEX,这是一个全局唯一标识符 (GUID),其值标识ConnectEx扩展功能。成功时,由WSAIoctl返回的输出包含指向ConnectEx函数的指针。WSAID_CONNECTEX GUID在头文件Mswsock.h中定义。
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);