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

标签 windows winsock2 windows-socket-api wsastartup

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

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

如果没有,调用它。一个小测试表明多次调用 WSAStartup 是可以接受的。 但是如果请求不同的 winsock 版本会发生什么?这会破坏应用程序的其他部分吗?

最佳答案

是的,这是可能的。

这是它是如何完成的。

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.
    // ...         
}

但实际上并没有必要这样做。随时调用 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 - 是否可以判断进程中是否调用了 WSAStartup?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1869689/

相关文章:

c - C 中的 HTTP : Why do I have to call recv() multiple times?

c++ - 发送/接收结构而不是 char 数组

c++ - 从多个线程调用 WSAStartup() 会导致死锁吗?

c++ - 绑定(bind)服务器套接字时出现 WSA 错误 10048

linux - Git 符号链接(symbolic link) - Windows 工作站 - Linux 服务器

c++ - 找不到 libpng14-14.dll

mysql - 在 Windows 服务器和 Ubuntu 上运行 Mysql 8.0 - 比较

c++ - 错误 124 - SHFileOperation 的系统调用级别不正确

c++ - WinSock c++ inet_ntop 总是显示 204.204.204.204(并且 accept() 没有失败)