我已经开始编写一个使用套接字的 ActiveX 控件。
使用此控件的应用程序可能会也可能不会使用套接字。我的控件是否可以判断 WSAStartup 是否已被调用?
如果没有,请调用它。一个小测试表明多次调用 WSAStartup 是可以接受的。但是如果请求不同的 winsock 版本会发生什么?这会破坏应用程序的其他部分吗?
我已经开始编写一个使用套接字的 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
不,无法判断是否WSAStartup()
已被调用。
是的,WSAStartup()
可以在单个进程中多次调用,只要请求的版本受 WinSock DLL 支持。呼吁WSAStartup()
并且WSACleanup()
必须平衡。
WinSock 初始化是一个协商的过程;您有责任验证WSAStartup()
返回的信息,以确保它符合您应用的要求。
现有套接字不受后续WSAStartup()
调用的影响。
允许使用不同 WinSock 版本的多个套接字。