17

ソケットを利用する ActiveX コントロールの作成を開始しました。

このコントロールを使用するアプリケーションは、ソケットも使用する場合と使用しない場合があります。WSAStartup が呼び出されたかどうかをコントロールで判断することはできますか?

そうでない場合は、電話してください。ちょっとしたテストで、WSAStartup の複数回の呼び出しが許容されることがわかりました。しかし、別のバージョンの winsock が要求された場合はどうなるでしょうか? これにより、アプリケーションの他の部分が壊れますか?

4

2 に答える 2

31

はい、可能です。

そして、これがその方法です。

bool WinsockInitialized()
{
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET){
        return false;
    }

    closesocket(s);
    return true;
}

int main()
{
    //...
    if ( !WinsockInitialized() )
       // Init winsock here...

    // Carry on as normal.
    // ...         
}

しかし、これを行う必要はありません。いつでもWSAStartupを呼び出すのは非常に安全です。また、WSAStartup()への正常な呼び出しを、WSACleanup()への一致する呼び出しで終了することも安全です。

例えば

// 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
于 2009-12-09T03:37:40.477 に答える
5
  • WSAStartup()いいえ、すでに呼び出されている かどうかを確認することはできません。

  • はい、WSAStartup()要求されたバージョンが WinSock DLL によってサポートされている限り、1 つのプロセスで複数回呼び出すことができます。WSAStartup()とへの呼び出しはWSACleanup()バランスが取れている必要があります。

  • WinSock の初期化はネゴシエートされたプロセスです。WSAStartup()返される情報を検証して、アプリの要件を満たしていることを確認する 責任があります。

  • WSAStartup()既存のソケットは、後続の呼び出し の影響を受けません。

  • 異なる WinSock バージョンを使用する複数のソケットが許可されます。

詳細については、WSAStartup()ドキュメントを参照してください。

于 2009-12-09T01:19:05.197 に答える