2009-12-08 11 views
13

J'ai commencé à écrire un contrôle ActiveX qui utilise des sockets.Est-il possible de dire si WSAStartup a été appelé dans un processus?

Les applications qui utilisent ce contrôle peuvent utiliser ou non des sockets. Mon contrôle peut-il indiquer si WSAStartup a été appelé?

Sinon, appelez-le. Un petit test révèle que l'appel WSAStartup plusieurs fois est tollerated. Mais que se passe-t-il si une version différente de winsock est demandée? cela va-t-il casser d'autres parties de l'application?

Répondre

26

Oui, c'est possible.

Et voici comment c'est fait.

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. 
    // ...   
} 

Mais ce n'est pas vraiment nécessaire de le faire. Il est tout à fait sûr d'appeler WSAStartup à tout moment. Il est également sûr de terminer chaque appel réussi à WSAStartup() avec un appel correspondant à WSACleanup().

par exemple.

// 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

N'oubliez pas d'appeler 'closesocket()' si 'socket()' est réussi dans 'WinsockInitialized()', sinon vous avez une fuite. –

+1

bon point! fixé cela. – Matt

+0

Il n'est pas prudent d'appeler WSAStartup à tout moment. De MSDN: "La fonction WSAStartup entraîne généralement le chargement de DLL auxiliaires spécifiques au protocole, ce qui signifie que la fonction WSAStartup ne doit pas être appelée à partir de la fonction DllMain dans une DLL d'application, ce qui peut entraîner des blocages" – czz

2
  • Non, il n'est pas possible de dire si WSAStartup() a déjà été appelé.

  • Oui, WSAStartup() peut être appelé plusieurs fois dans un seul processus, tant que la version demandée est prise en charge par la DLL WinSock. Les appels vers WSAStartup() et WSACleanup() doivent être équilibrés.

  • L'initialisation WinSock est un processus négocié; vous êtes responsable de la validation des informations renvoyées par WSAStartup() pour vous assurer qu'elles répondent aux exigences de votre application.

  • Les sockets existants ne sont pas affectés par les appels WSAStartup() suivants.

  • Plusieurs sockets utilisant différentes versions de WinSock sont autorisées.

Voir the WSAStartup() documentation pour plus d'informations.

+0

En plus de cela, je l'ai trouvé que tant que le nombre d'appels de WSACleanup correspondent au nombre d'appels réussis WSAStartup appelant alors WSACleanup ne sera pas affecter d'autres appels de socket. Bien sûr, vous n'appelez pas WSACleanup trop souvent. – Matt