Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top