使用 CreateFile 打开一个套接字

Posted

技术标签:

【中文标题】使用 CreateFile 打开一个套接字【英文标题】:Open a socket using CreateFile 【发布时间】:2009-02-05 16:50:35 【问题描述】:

我们有一些旧的串行代码,只需打开然后关闭它即可检查串行端口是否可用。现在我们正在向应用程序添加网络支持,我想通过提供 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 打开套接字的正确方法是什么?

【问题讨论】:

【参考方案1】:

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

【讨论】:

我知道你可以使用 ReadFile 和 WriteFile,但我想你也可以使用 CreateFile。看来我将不得不编写所有额外的样板代码来解决系统是围绕串行端口构建的事实:-(【参考方案2】:

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

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

【讨论】:

以上是关于使用 CreateFile 打开一个套接字的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 CreateFile 函数打开文件

CreateFile 无法在 Windows 中打开 HID 设备

Createfile打开磁盘的格式要求

无法通过 CreateFile 打开设备,ERROR_INVALID_FUNCTION

用CreateFile打开串口超过com10就不能打开,解决办法

使用CreateFile读写文件