是否有可能判断WSAStartup是否在进程中被调用?

我已经开始编写一个使用套接字的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()文档 。