17

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

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

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

4

2 回答 2

31

是的,有可能。

这就是它的完成方式。

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
于 2009-12-09T03:37:40.477 回答
5
  • 不,无法判断是否WSAStartup()已被调用。

  • 是的,WSAStartup()可以在单个进程中多次调用,只要请求的版本受 WinSock DLL 支持。呼吁WSAStartup()并且WSACleanup()必须平衡。

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

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

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

有关更多信息,WSAStartup()请参阅文档

于 2009-12-09T01:19:05.197 回答