CreateFile을 사용하여 소켓을 엽니 다
-
21-08-2019 - |
문제
직렬 포트가 단순히 열린 다음 닫아서 사용할 수 있는지 확인하는 이전 직렬 코드가 있습니다. 이제 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을 통해 소켓을 여는 올바른 방법이 무엇인지 궁금했습니다.
해결책
CreateFile을 통해 소켓을 만들 수 없습니다. 창을 사용해야합니다 소켓 API 이 목적을 위해. 소켓 핸들을 만들려면 사용합니다 wsasocket. 이 기능으로 반환 된 소켓은 일부와 함께 Windows 핸들로 사용할 수 있습니다. readfile 및 writefile과 같은 Windows 기능.
다른 팁
나는 당신이 소켓을 조작 할 수 있다고 생각하지 않습니다 CreateFile()
. 소켓은 BSD (IIRC)에서 가져온 추상화로 이름을 호환 가능한 방식으로 구현 한 것입니다 (원래는 winsock.h
, 그리고 현재 winsock2.h
). 나는 MS가 소켓에 대한 지원을 추가 한 적이 없다고 생각합니다. CreateFile()
.
더 많은 근거 : 대부분 (모든 것?) CreateFile()
조작은 기본 창 손잡이를 반환합니다. 소켓은 네이티브가 아닌 추상화이기 때문에 OS에 기본 핸들이 없으므로 의미가 없습니다. CreateFile()
그들을 다루기 위해.