是否可以告诉我们,如果WSAStartup已被称为一个进程?
-
18-09-2019 - |
题
我已经开始写了一件控制使用座。
使用这种控制可能或不可能,也使用插座。是否有可能为我的控诉是否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()
文档 更多的信息。
不隶属于 StackOverflow