Можно ли определить, вызван ли WSAStartup в процессе?

Я начал писать элемент управления ActiveX, который использует сокеты.

Приложения, использующие этот элемент управления, могут или не могут также использовать сокеты. Возможно ли для моего элемента управления определить, был ли вызван WSAStartup?

Если нет, вызовите его. Небольшой тест показывает, что вызов WSAStartup несколько раз обновляется. Но что произойдет, если запрашивается другая версия winsock? это нарушит другие части приложения?

Ответы

Ответ 1

Да, это возможно.

И вот как это делается.

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

Ответ 2

  • Нет, невозможно определить, была ли уже вызвана WSAStartup().

  • Да, WSAStartup() можно вызывать несколько раз в одном процессе, если запрашиваемая версия поддерживается библиотекой WinSock DLL. Вызовы WSAStartup() и WSACleanup() должны быть сбалансированы.

  • Инициализация WinSock - это согласованный процесс; вы отвечаете за проверку информации, возвращаемой WSAStartup(), чтобы убедиться, что она соответствует вашим требованиям к приложениям.

  • Существующие сокеты не влияют на последующие вызовы WSAStartup().

  • Разрешено несколько сокетов с использованием разных версий WinSock.

Подробнее см. документацию WSAStartup().