Можно ли определить, вызван ли 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() документация для получения дополнительной информации.

Другие вопросы по тегам