我们有一些旧的串行代码,可以通过打开然后关闭它来检查串口是否可用。现在我们通过将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打开套接字的正确方法是什么?
答案 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()
处理它们是没有意义的。