質問

私たちは、シリアルポートがそれを開いて、それを閉じることにより簡単に利用できるかどうかをチェックするいくつかの古いシリアルコードを持っています。今、私たちは、私は、文字列としてIPアドレスを供給することによって機能を再利用したいアプリにネットワークサポートを追加しています。

/**
 * So far I have tried:
 * A passed in portPath normally looks like:
\\?\acpi#pnp0501#1#1#{GUID}          
10.2.0.155:2001
//10.2.0.155:2001/
\\.\10.2.0.155:2001\
\\?\10.2.0.155:2001\
 * all without success.
 */
    bool PortIsAvailable( const CString& portPath )
    {
        HANDLE hCom = ::CreateFile( portPath,
                                   GENERIC_READ | GENERIC_WRITE,
                                   0,                    // comm devices must be opened with exclusive-access
                                   NULL,                 // no security attributes
                                   OPEN_EXISTING,        // comm devices must use OPEN_EXISTING
                                   FILE_FLAG_OVERLAPPED, // not overlapped I/O
                                   NULL );                // hTemplate must be NULL for comm devices
        if (INVALID_HANDLE_VALUE != hCom ) 
        {
            ::CloseHandle( hCom );
            return true;
        }
        return false;
    }

私は、シャットダウンが続くが、私は最小限の変更で機能を再利用したい接続し使用することができます知っています。私はそんなに良く機能を再利用することができます。いない場合、私はそれがソケットであるか否かを判断するコードを記述する必要があります。

私はCreateFileを介して、ソケットを開く正しい方法とは何か不思議でしたか?

役に立ちましたか?

解決

あなたはCreateFileを介して、ソケットを作成することはできません。あなたは、このための窓ソケットAPI を使用する必要があります目的。 SOCKETハンドルを作成するためには、使用やWSASocketする 。 Windowsは、いくつかの<のhref =「http://msdn.microsoft.com/en-us/library/ms740522(VS.85).aspx」のrel =」でハンドルと、この関数によって返されたソケットを使用できることに注意してくださいこのようReadFile関数やWriteFile関数のようnoreferrer nofollowを "> Windowsの機能、。

他のヒント

私はあなたがCreateFile()でソケットを操作することができると信じていません。ソケットは、BSD(IIRC)からインポートおよび名前互換の方法で実装抽象ある(本来winsock.hを介して、現在winsock2.h)。私は、MSが今までCreateFile()にソケットのサポートを追加しないと思います。

その他の根拠:ほとんどの(?すべて)CreateFile()操作するには、ネイティブのWindowsハンドルを返します。ソケットが非ネイティブ抽象化されているので、彼らはOSでネイティブのハンドルを持っていないので、CreateFile()はそれらを処理することは意味がありません。

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