Вопрос по connect, asynchronous, visual-c++, windows-7 – Где определен ConnectEx?

2

Я хочу использовать функцию ConnectEx на Windows7, с MSVC2010.

Я получаю сообщение об ошибке C3861: "ConnectEx": идентификатор не найден

MSDN предлагает, чтобы эта функция была объявлена в mswsock.h, однако при ее проверке она там не определена.

Какие-нибудь советы?

Ваш Ответ

1   ответ
7

статья MSDN дляConnectEx() Вы упомянули, это говорит:

Note The function pointer for the ConnectEx function must be obtained at run time by making a call to the WSAIoctl function with the SIO_GET_EXTENSION_FUNCTION_POINTER opcode specified. The input buffer passed to the WSAIoctl function must contain WSAID_CONNECTEX, a globally unique identifier (GUID) whose value identifies the ConnectEx extension function. On success, the output returned by the WSAIoctl function contains a pointer to the ConnectEx function. The WSAID_CONNECTEX GUID is defined in the Mswsock.h header file.

В отличие от других функций 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);
+ фрагмент кода, как это сделать:lenholgate.com/blog/2005/05/…
Вот и все. Спасибо! Martin Sustrik

Похожие вопросы