Abrir um socket usando CreateFile
-
21-08-2019 - |
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 é?
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.