Можно ли определить, вызван ли WSAStartup в процессе?
Я начал писать элемент управления ActiveX, который использует сокеты.
Приложения, которые используют этот элемент управления, могут или не могут также использовать сокеты. Возможно ли для моего элемента управления определить, был ли вызван WSAStartup?
Если нет, позвони. Небольшой тест показывает, что вызов WSAStartup несколько раз является допустимым. Но что произойдет, если будет запрошена другая версия winsock? это сломает другие части приложения?
2 ответа
Да, это возможно.
И вот как это делается.
bool WinsockInitialized()
{
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET && WSAGetLastError() == WSANOTINITIALISED){
return false;
}
closesocket(s)
return true;
}
int main()
{
//...
if ( !WinsockInitialized() )
// Init winsock here...
// Carry on as normal.
// ...
}
Но в этом нет необходимости. В любое время достаточно безопасно вызвать WSAStartup. Также можно завершить каждый успешный вызов WSAStartup() соответствующим вызовом WSACleanup().
например
// socket calls here would be an error, not initialized
WSAStartup(...)
// socket calls here OK
WSAStartup(...)
// more socket calls OK
WSACleanup()
// socket calls OK
WSACleanup()
// more socket calls error, not initialized
Нет, невозможно сказать, если
WSAStartup()
уже был вызван.Да,
WSAStartup()
может вызываться несколько раз в одном процессе, если запрашиваемая версия поддерживается WinSock DLL. Звонки вWSAStartup()
а такжеWSACleanup()
должен быть сбалансирован.Инициализация WinSock является согласованным процессом; Вы несете ответственность за проверку информации, которая
WSAStartup()
возвращается, чтобы убедиться, что оно соответствует требованиям вашего приложения.Существующие сокеты не затрагиваются последующими
WSAStartup()
звонки.Допускается использование нескольких сокетов с использованием разных версий WinSock.
Увидеть WSAStartup()
документация для получения дополнительной информации.