Pregunta

Tenemos un código de serie anterior que comprueba si un puerto serie está disponible con sólo abrir y luego cerrándola. Ahora estamos añadiendo soporte de la red a la aplicación que quiero volver a utilizar la función proporcionando la dirección IP como una cadena.

/**
 * 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;
    }

Sé que podría utilizan Connect seguido por el apagado pero quiero volver a utilizar la función con cambios mínimos. Si puedo volver a utilizar la función tanto mejor. Si no, entonces voy a tener que escribir código que determina si se trata de una toma o no.

Me preguntaba cuál es la forma correcta de abrir un socket a través de CreateFile es?

¿Fue útil?

Solución

No se puede crear un socket a través de CreateFile. Debe utilizar las ventanas socket API de este propósito. Para crear el mango del zócalo, utiliza WSASocket . Tenga en cuenta que el socket devuelto por esta función se puede utilizar como una manija de Windows con un poco funciones de Windows, como ReadFile y WriteFile .

Otros consejos

No creo que se puede manipular con tomas CreateFile(). Los sockets son una abstracción importado de BSD (IIRC) y aplicado de una manera compatible con el nombre (originalmente a través de winsock.h, y actualmente winsock2.h). No creo que jamás MS añadió soporte para sockets a <=>.

Más razón de ser: La mayoría (? Todo) <=> manipula devuelve un identificador de Windows nativo. Debido a que los zócalos son una abstracción no nativo, que no tienen un mango nativa en el sistema operativo, por lo que no tendría sentido para <=> para manejarlos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top