窗口 – 可以判断一个进程中是否已经调用了WSAStartup?

前端之家收集整理的这篇文章主要介绍了窗口 – 可以判断一个进程中是否已经调用了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

猜你在找的Windows相关文章