Pergunta

Temos um código de série antigo, que verifica se uma porta serial está disponível apenas abrindo-o e depois fechá-lo. Agora estamos adicionando suporte de rede para o aplicativo eu quero reutilizar a função, fornecendo o endereço IP como uma string.

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

Eu sei que eu poderia usar connect seguido de desligamento, mas eu quero reutilizar a função com alterações mínimas. Se eu posso reutilizar a função tanto melhor. Se não, então vou ter que escrever código que determina se ele é um soquete ou não.

Eu queria saber qual a maneira correta de abrir um socket via CreateFile é?

Foi útil?

Solução

Você não pode criar um socket via CreateFile. Você deve usar as janelas tomada API para esta objetivo. Para criar o identificador de soquete, você usa WSASocket . Note-se que o socket retornado por esta função pode ser usado como um identificador do Windows com alguns funções do Windows, tais como ReadFile e WriteFile .

Outras dicas

Eu não acredito que você pode manipular soquetes com CreateFile(). Sockets são uma abstração importado da BSD (IIRC) e implementado de uma forma nome-compatível (originalmente via winsock.h, e atualmente winsock2.h). Eu não acho que MS suporte já adicionado para tomadas para CreateFile().

Mais lógica: A maioria CreateFile() manipula retorna um manipulador nativo do Windows (tudo?). Como os sockets são uma abstração não-nativa, eles não têm uma alça nativa no sistema operacional, por isso não faria sentido para CreateFile() para lidar com eles.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top