是否可以判断是否在进程中调用了WSAStartup?

我已经开始编写一个使用套接字的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是相当安全的。使用与WSACleanup()的匹配调用结束对WSAStartup()的每次成功调用也是安全的。 例如
// 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()
。 是的,只要WinSock DLL支持所请求的版本,就可以在一个进程中多次调用
WSAStartup()
。必须平衡对
WSAStartup()
WSACleanup()
的呼叫。 WinSock初始化是一个协商过程;您有责任验证
WSAStartup()
返回的信息,以确保它符合您的应用程序的要求。 现有套接字不受后续
WSAStartup()
调用的影响。 允许使用不同WinSock版本的多个套接字。 有关更多信息,请参阅
WSAStartup()
文档。     

要回复问题请先登录注册