使用CreateFile打开套接字

时间:2009-02-05 16:50:36

标签: c++ winapi sockets serial-port createfile

我们有一些旧的串行代码,可以通过打开然后关闭它来检查串口是否可用。现在我们通过将ip地址作为字符串提供给我想要重用该功能的app添加网络支持。

/**
 * 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打开套接字的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

您无法通过CreateFile创建套接字。您应该使用窗口socket API来实现此目的。要创建SOCKET句柄,请使用WSASocket。请注意,此函数返回的SOCKET可用作具有一些Windows functions, such as ReadFile and WriteFile的Windows句柄。

答案 1 :(得分:0)

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

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