2009-12-08 4 views
13

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

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

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

ответ

26

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

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

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 
+6

Не забудьте вызвать 'closesocket()' if 'socket()' успешно в 'WinsockInitialized()', иначе у вас есть утечка. –

+1

хорошо пункт! исправлено это. – Matt

+0

В любой момент не рекомендуется вызывать WSAStartup. Из MSDN: «Функция WSAStartup обычно приводит к загрузке DLL-файлов вспомогательных протоколов. В результате функция WSAStartup не должна вызываться из функции DllMain в DLL приложения. Это может потенциально вызвать взаимоблокировки« – czz

2
  • Нет, нельзя сказать, было ли уже вызвано WSAStartup().

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

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

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

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

См. the WSAStartup() documentation для получения дополнительной информации.

+0

В дополнение к этому, я обнаружил, что пока число WSACleanup звонков соответствует числу успешных вызовов WSAStartup то вызов WSACleanup не будет влиять на другие вызовы сокетов. Разумеется, вы не называете WSACleanup слишком много раз. – Matt

 Смежные вопросы

  • Нет связанных вопросов^_^