Abrir un socket utilizando CreateFile
-
21-08-2019 - |
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?
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.