Ouvrez une prise à l'aide CreateFile
-
21-08-2019 - |
Question
Nous avons un vieux code de série qui vérifie si un port série est disponible simplement en ouvrant et refermant. Maintenant, nous ajoutons le support réseau à l'application que je veux réutiliser la fonction en fournissant l'adresse IP comme une chaîne.
/**
* 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;
}
Je sais que je pourrais utiliser connecter suivi par l'arrêt mais je veux réutiliser la fonction avec des changements minimes. Si je peux réutiliser la fonction tant mieux. Sinon, je vais devoir écrire du code qui détermine si elle est une prise ou non.
Je me demandais ce que la bonne façon d'ouvrir une prise via CreateFile est?
La solution
Vous ne pouvez pas créer une socket via CreateFile. Vous devez utiliser les fenêtres pour cette objectif. Pour créer la poignée CREUSE, utilisez WSASocket . Notez que la prise retournée par cette fonction peut être utilisée comme Windows Handle avec certains fonctions Windows, telles que ReadFile et WriteFile .
Autres conseils
Je ne crois pas que vous pouvez manipuler prises avec CreateFile()
. Les prises sont une abstraction importée de BSD (IIRC) et mis en œuvre de manière compatible avec le nom (à l'origine par winsock.h
, et actuellement winsock2.h
). Je ne pense pas prise en charge MS jamais ajouté pour les sockets à <=>.
Plus Justification: La plupart (? Tout) retourne une <=> manipule poignée natif de Windows. Parce que les prises sont une abstraction non-native, ils ne sont pas une poignée native dans le système d'exploitation, il ne serait pas logique pour les gérer <=>.