2009-02-05 87 views
1

我们已经有了一些旧的串行代码,通过打开它然后关闭它来检查串行端口是否可用。现在我们通过提供ip地址作为字符串来为应用重新添加网络支持。使用CreateFile打开一个套接字

/** 
* 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; 
    } 

我知道我可以使用连接,然后关机,但我想用最少的更改重用该功能。如果我能够更好地重用这个功能。如果没有,那么我将不得不编写代码来确定它是否是套接字。

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

回答

3

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

+0

我知道你可以使用ReadFile和WriteFile,但我想你也可以使用CreateFile。看来我将不得不编写所有额外的样板代码来解决系统围绕串行端口构建的问题:-( – 2009-02-06 06:21:40

0

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

更多依据:大部分(所有内容?)CreateFile()操作返回本机Windows句柄。由于套接字是非本地抽象,因此它们在操作系统中没有本地句柄,因此CreateFile()无法处理它们。

相关问题