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

时间:2009-12-08 20:40:53

标签: windows winsock2 windows-socket-api wsastartup

我开始编写一个使用套接字的ActiveX控件。

使用此控件的应用程序可能也可能不使用套接字。 我的控件是否可以判断是否已调用WSAStartup?

如果没有,请拨打电话。一个小小的测试表明,多次调用WSAStartup是很容易的。 但是如果要求使用不同的winsock版本会发生什么?这会破坏申请的其他部分吗?

2 个答案:

答案 0 :(得分:28)

是的,这是可能的。

以下是它的完成方式。

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()的每次成功调用也是安全的。

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

答案 1 :(得分:3)

  • 不,无法判断是否已调用WSAStartup()

  • 是的,WSAStartup()可以在一个进程中多次调用,只要WinSock DLL支持所请求的版本即可。必须平衡对WSAStartup()WSACleanup()的呼叫。

  • WinSock初始化是一个协商过程;您有责任验证WSAStartup()返回的信息,以确保其符合您应用的要求。

  • 现有套接字不受后续WSAStartup()次调用的影响。

  • 允许使用不同WinSock版本的多个套接字。

有关详细信息,请参阅the WSAStartup() documentation