【问题标题】:Where is ConnectEx defined?ConnectEx 在哪里定义?
【发布时间】:2012-06-10 09:05:14
【问题描述】:

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

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

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

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

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

    注意必须获取ConnectEx函数的函数指针 在运行时通过调用 WSAIoctl 函数 SIO_GET_EXTENSION_FUNCTION_POINTER 指定操作码。输入缓冲区 传递给 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);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 2016-02-19
    • 2016-12-31
    • 2011-10-08
    • 2010-09-30
    • 2013-04-04
    • 2019-01-01
    相关资源
    最近更新 更多