Можно ли сказать, был ли WsaStartup был вызван в процессе?
-
18-09-2019 - |
Вопрос
Я начал писать контроль ActiveX, который использует розетки.
Приложения, которые используют этот элемент управления, могут также использовать сокеты. Возможно ли мой контроль сказать, был ли WsaStartup был вызван?
Если нет, назовите это. Небольшой тест показывает, что вызов WsaStartup несколько раз пролетает. Но что произойдет, если запрашивается другая версия Winsock? Это нарушит другие части приложения?
Решение
Да, это возможно.
И вот как это делается.
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()
документация Чтобы получить больше информации.