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?

Était-ce utile?

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 <=>.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top