문제

직렬 포트가 단순히 열린 다음 닫아서 사용할 수 있는지 확인하는 이전 직렬 코드가 있습니다. 이제 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() 그들을 다루기 위해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top