Is it possible to tell if WSAStartup has been called in a process?

后端 未结 2 1028
太阳男子
太阳男子 2020-12-28 08:43

I\'ve started writing an ActiveX control that makes use of sockets.

Applications that use this control may or may not also use sockets. Is it possible for my control

相关标签:
2条回答
  • 2020-12-28 09:05
    • No, it is not possible to tell if WSAStartup() has already been called.

    • Yes, WSAStartup() can be called multiple times in a single process, as long as the requested version is supported by the WinSock DLL. Calls to WSAStartup() and WSACleanup() must be balanced.

    • WinSock initialization is a negotiated process; you are responsible for validating the info that WSAStartup() returns to make sure it meets your app's requirements.

    • Existing sockets are not affected by subsequent WSAStartup() calls.

    • Multiple sockets using different WinSock versions is allowed.

    See the WSAStartup() documentation for more information.

    0 讨论(0)
  • 2020-12-28 09:13

    Yes it is possible.

    And here is how it's done.

    bool WinsockInitialized()
    {
        SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (s == INVALID_SOCKET){
            return false;
        }
    
        closesocket(s);
        return true;
    }
    
    int main()
    {
        //...
        if ( !WinsockInitialized() )
           // Init winsock here...
    
        // Carry on as normal.
        // ...         
    }
    

    But it's not really necessary to do this. It's quite safe to call WSAStartup at any time. It's also safe to end each successful call to WSAStartup() with a matching call to WSACleanup().

    e.g.

    // 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
    
    0 讨论(0)
提交回复
热议问题