我开始编写一个使用套接字的ActiveX控件.
使用此控件的应用程序可能也可能不使用套接字.
我的控制是否可以告诉WSAStartup是否已被调用?
如果不是,叫它.有一点测试显示,多次调用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