我开始编写一个使用套接字的ActiveX控件。
使用此控件的应用程序可能也可能不使用套接字。 我的控件是否可以判断是否已调用WSAStartup?
如果没有,请拨打电话。一个小小的测试表明,多次调用WSAStartup是很容易的。 但是如果要求使用不同的winsock版本会发生什么?这会破坏申请的其他部分吗?
答案 0 :(得分:28)
是的,这是可能的。
以下是它的完成方式。
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
答案 1 :(得分:3)
不,无法判断是否已调用WSAStartup()
。
是的,WSAStartup()
可以在一个进程中多次调用,只要WinSock DLL支持所请求的版本即可。必须平衡对WSAStartup()
和WSACleanup()
的呼叫。
WinSock初始化是一个协商过程;您有责任验证WSAStartup()
返回的信息,以确保其符合您应用的要求。
现有套接字不受后续WSAStartup()
次调用的影响。
允许使用不同WinSock版本的多个套接字。
有关详细信息,请参阅the WSAStartup()
documentation。