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 然后关闭,但我想以最少的更改重用该功能。如果我能重用这个功能就更好了。如果不是,那么我将不得不编写代码来确定它是否是套接字。

我想知道通过 CreateFile 打开套接字的正确方法是什么?

4

2 回答 2

3

您不能通过 CreateFile 创建套接字。为此,您应该使用 Windows套接字 API 。要创建 SOCKET 句柄,您可以使用WSASocket。请注意,此函数返回的 SOCKET 可以用作带有某些Windows 函数的 Windows 句柄,例如 ReadFile 和 WriteFile

于 2009-02-05T19:39:45.297 回答
0

我不相信您可以使用CreateFile(). 套接字是从 BSD (iirc) 导入的抽象,并以名称兼容的方式实现(最初是 via winsock.h,现在是winsock2.h)。我认为 MS 从未将套接字支持添加到CreateFile().

更多理由:大多数(一切?)CreateFile()操作返回本机 Windows 句柄。因为套接字是一种非本地抽象,它们在操作系统中没有本地句柄,所以CreateFile()处理它们没有意义。

于 2009-02-05T19:13:43.960 回答