Domanda

Abbiamo un po 'di codice seriale vecchio che verifica se una porta seriale è disponibile semplicemente aprendo e chiudendo. Ora stiamo aggiungendo il supporto di rete per l'applicazione che voglio riutilizzare la funzione fornendo l'indirizzo IP sotto forma di stringa.

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

So che potrei utilizzano Connect seguito da arresto ma voglio riutilizzare la funzione con modifiche minime. Se posso riutilizzare la funzione tanto meglio. Se poi non dovrà scrivere codice che determina se è una presa o meno.

Mi chiedevo che cosa il modo corretto di aprire un socket tramite CreateFile è?

È stato utile?

Soluzione

Non è possibile creare un socket tramite CreateFile. Si consiglia di utilizzare le finestre presa API per questo scopo. Per creare l'handle di socket, si utilizza WSASocket . Si noti che il socket restituito da questa funzione può essere utilizzata come Maneggiare un Windows con un po ' funzioni di Windows, come ad esempio ReadFile e WriteFile .

Altri suggerimenti

Io non credo che si possa manipolare prese con CreateFile(). Sockets sono un'astrazione importata da BSD (IIRC) e attuato in modo nome-compatibile (in origine via winsock.h, e attualmente winsock2.h). Non credo che MS mai aggiunto il supporto per i socket a <=>.

Più logica: La maggior parte (? Tutto) <=> manipola restituisce un handle Windows nativo. Perché prese sono un'astrazione non nativa, non hanno una maniglia nativo nel sistema operativo, quindi non avrebbe senso per <=> per gestirli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top