2009-12-08 97 views
13

我已經開始編寫一個使用套接字的ActiveX控件。是否有可能判斷WSAStartup是否在進程中被調用?

使用此控件的應用程序可能也可能不會使用套接字。 我的控件可以告訴WSAStartup是否已被調用?

如果沒有,請調用它。一個小小的測試表明,多次調用WSAStartup會受到懲罰。 但是,如果請求不同的winsock版本,會發生什麼?這會破壞應用程序的其他部分嗎?

回答

26

是的,這是可能的。

這是它是如何完成的。

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 
+6

如果'socket()'在WinsockInitialized()中成功,請不要忘記調用'closesocket()',否則你有泄漏。 – 2014-05-05 21:42:54

+1

好點!固定的。 – Matt 2015-01-27 18:18:47

+0

隨時調用WSAStartup是不安全的。從MSDN:「WSAStartup函數通常會導致協議特定的幫助程序DLL被加載,因此WSAStartup函數不應該從應用程序DLL中的DllMain函數中調用,這可能會導致死鎖」 – czz 2015-07-07 02:02:55

2
  • 不,不知道WSAStartup()是否已被調用。

  • 是的,WSAStartup()可以在單個進程中多次調用,只要WinSock DLL支持所請求的版本即可。致電WSAStartup()WSACleanup()必須平衡。

  • WinSock初始化是一個協商過程;您有責任驗證WSAStartup()返回的信息,以確保它符合您應用的要求。

  • 現有套接字不受後續WSAStartup()調用的影響。

  • 允許使用不同WinSock版本的多個套接字。

查看the WSAStartup() documentation瞭解更多信息。

+0

除此之外,我發現,只要WSACleanup調用的數量匹配成功地調用WSAStartup調用的次數,然後再調用WSACleanup不會影響到其他套接字調用。當然,你不會多次調用WSACleanup。 – Matt 2009-12-09 03:07:44

相關問題