WSAStartup がプロセス内で呼び出されているかどうかを確認することはできますか?

StackOverflow https://stackoverflow.com/questions/1869689

質問

ソケットを利用する 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

他のヒント

  • いいえ、それはわかりません。 WSAStartup() すでに呼ばれています。

  • はい、 WSAStartup() 要求されたバージョンが WinSock DLL でサポートされている限り、単一プロセスで複数回呼び出すことができます。に電話をかける WSAStartup() そして WSACleanup() バランスがとれていなければなりません。

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

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

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

見る WSAStartup() ドキュメンテーション 詳細については。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top