1

シリアルポートを開いてから閉じるだけで、シリアルポートが使用可能かどうかを確認する古いシリアルコードがあります。今、ネットワーク サポートをアプリに追加しています。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;
    }

connect に続いて shutdown を使用できることはわかっていますが、最小限の変更で関数を再利用したいと考えています。関数を再利用できれば、なおさらです。そうでない場合は、ソケットかどうかを判断するコードを作成する必要があります。

CreateFile を介してソケットを開く正しい方法は何だろうと思っていました。

4

2 に答える 2

3

CreateFileを介してソケットを作成することはできません。この目的には、WindowsソケットAPIを使用する必要があります。SOCKETハンドルを作成するには、WSASocketを使用します。この関数によって返されるSOCKETは、ReadFileやWriteFileなどの一部のWindows関数でWindowsハンドルとして使用できることに注意してください。

于 2009-02-05T19:39:45.297 に答える
0

でソケットを操作できるとは思いませんCreateFile()。ソケットは、BSD (iirc) からインポートされた抽象化であり、名前に互換性のある方法で実装されています (元は 経由winsock.hで、現在はwinsock2.h)。MS がソケットのサポートを に追加したことはないと思いますCreateFile()

さらなる根拠: ほとんど (すべて?)CreateFile()の操作は、ネイティブの Windows ハンドルを返します。ソケットはネイティブではない抽象化であるため、OS にはネイティブ ハンドルがありませんCreateFile()

于 2009-02-05T19:13:43.960 に答える