我已经开始编写一个使用套接字的ActiveX控件。
使用此控件的应用程序可能也可能不会使用套接字。 是否可以让我的控制来判断WSAStartup是否被调用?
如果没有,就调用它。 一个小小的testing表明,多次调用WSAStartup是受到攻击的。 但是,如果要求不同的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()的每次成功调用也是安全的。
例如
// 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()
是否已被调用。
是的,只要WinSock DLL支持请求的版本,就可以在一个进程中多次调用WSAStartup()
。 调用WSAStartup()
和WSACleanup()
必须是平衡的。
WinSock初始化是一个谈判过程; 您负责验证WSAStartup()
返回的信息,以确保它满足您的应用程序的要求。
现有的套接字不受随后的WSAStartup()
调用的影响。
允许使用不同WinSock版本的多个套接字。
有关更多信息,请参阅WSAStartup()
文档 。