Откройте сокет, используя CreateFile - PullRequest
1 голос
/ 05 февраля 2009

У нас есть некоторый старый последовательный код, который проверяет, доступен ли последовательный порт, просто открыв его и закрыв. Теперь мы добавляем поддержку сети в приложение. Я хочу повторно использовать функцию, указав 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;
    }

Я знаю, что мог бы использовать соединение с последующим выключением, но я хочу повторно использовать функцию с минимальными изменениями. Если я смогу многократно использовать эту функцию, тем лучше. Если нет, то мне придется написать код, который определяет, является ли это сокетом или нет.

Мне было интересно, как правильно открыть сокет через CreateFile?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2009

Вы не можете создать сокет через CreateFile. Для этой цели вы должны использовать Windows API для сокетов . Для создания дескриптора SOCKET вы используете WSASocket . Обратите внимание, что SOCKET, возвращаемый этой функцией, можно использовать как дескриптор Windows с некоторыми функциями Windows, такими как ReadFile и WriteFile .

0 голосов
/ 05 февраля 2009

Я не верю, что вы можете манипулировать сокетами с помощью CreateFile(). Сокеты - это абстракция, импортированная из BSD (iirc) и реализованная совместимым с именами способом (первоначально через winsock.h, а в настоящее время winsock2.h). Я не думаю, что MS когда-либо добавляла поддержку сокетов к CreateFile().

Более разумное обоснование: большинство (все?) CreateFile() манипулирует возвращает собственный дескриптор Windows. Поскольку сокеты не являются нативной абстракцией, они не имеют собственного дескриптора в ОС, поэтому для CreateFile() не имеет смысла обрабатывать их.

...