我们已经有了哪些检查串行端口是否可以通过简单地打开它,然后将其关闭一些旧的串行代码。现在,我们正在增加网络支持的应用程序,我想作为一个字符串提供的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 BY关机,但我想重用以最小的功能改变。如果我可以重复使用的功能就更好了。如果没有,那么我会编写的代码,确定它是否是一个插座或没有。

我想知道通过的CreateFile打开插座的正确方法是什么?

有帮助吗?

解决方案

您不能创建通过的CreateFile的插座。您应该使用Windows 套接字API 此目的。为了创建套接字句柄,您可以使用 WSASocket 。请注意,这个函数返回的SOCKET可以作为一个Windows的一些的窗函数,如ReadFile和WriteFile的

其他提示

我不相信你可以操纵插座与CreateFile()。套接字是从BSD(IIRC)的进口,并在名称兼容的方式实施的提取(通过winsock.h原来,目前winsock2.h)。我不认为微软以往任何时候都增加了对套接字CreateFile()支持。

更多的理由:大多数(?一切)CreateFile()操纵返回本地Windows句柄。因为套接字是一个非母语的抽象,他们没有在操作系统原生手柄,所以它是没有意义的CreateFile()来处理它们。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top