Вопрос

Я начал писать контроль 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() документация Чтобы получить больше информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top