Тонкости функции WSAIoctl()
От: s3dworld Россия  
Дата: 05.10.11 10:27
Оценка:
Всем доброго дня!

Пишу на C++ под WinSock 2. Решил асинхронно подключиться клиентом, но для начала нужно получить адрес функции. Делаю так:


LPFN_CONNECTEX lpfnConnectEx=0;
GUID guidConnectEx=WSAID_CONNECTEX;
DWORD returnedBytes=0;

if(WSAIoctl(
    entitySocket,
    SIO_GET_EXTENSION_FUNCTION_POINTER,
    &guidConnectEx,
    sizeof(guidConnectEx),
    &lpfnConnectEx,
    sizeof(lpfnConnectEx),
    &returnedBytes,
    0,
    0)==SOCKET_ERROR) return WSAGetLastError();


Но тут меня осенила возможная ошибка — WSA_IO_PENDING. То есть это ещё надо код писать так, чтобы уже прослушивать порт и синхронизировать когда я всё таки получу этот адрес функции (например в потоке, который извлекает пакеты из порта, сбросить какое-то событие при завершение текущей операции получения адреса, а в этой функции ожидать это события). Собственно можно ли как-то получить этот адрес без асинхронного вызова, при уже созданном сокете таким вот образом?


entitySocket=WSASocket(_family,_type,_protocol,0,0,WSA_FLAG_OVERLAPPED);


И насколько ли хорошим будет вызывать в бесконечном цикле функцию WSAIoctl() с неким интервалом в миллисекундах, при возвращении ей кода ошибки WSAEWOULDBLOCK?
Re: Тонкости функции WSAIoctl()
От: Michael Chelnokov Украина  
Дата: 05.10.11 14:24
Оценка:
Здравствуйте, s3dworld, Вы писали:

S>Собственно можно ли как-то получить этот адрес без асинхронного вызова, при уже созданном сокете таким вот образом?

S>
S>entitySocket=WSASocket(_family,_type,_protocol,0,0,WSA_FLAG_OVERLAPPED);
S>


При старте программы создай сокет без WSA_FLAG_OVERLAPPED, получи адреса функций и закрой этот сокет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.