我已经开始写了一件控制使用座。

使用这种控制可能或不可能,也使用插座。是否有可能为我的控诉是否WSAStartup已经叫什么?

如果不是,叫它。一个小小的测试显示,叫WSAStartup多次tollerated.但如果发生了什么不同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()在每次成功呼叫。

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

其他提示

  • 不,这是不可能告诉我们,如果 WSAStartup() 已经被称为。

  • 是的, WSAStartup() 可以被多次在一个单一的进程,只要该请求的版本支持通过WinSock DLL。呼叫 WSAStartup()WSACleanup() 必须平衡。

  • WinSock初始化是一个谈判进程;你是负责验证的信息 WSAStartup() 返回,以确保它符合应用的要求。

  • 现有插座不会受到影响的后续 WSAStartup() 呼叫。

  • 多个插座采用不同的WinSock版本是允许的。

看看 WSAStartup() 文档 更多的信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top