Compartilhar via


Tipo de dados de soquete

Em aplicativos Winsock, um descritor de soquete não é um descritor de arquivo e deve ser usado com as funções Winsock.

No UNIX, um descritor de soquete é representado por um descritor de arquivo padrão. Como resultado, um descritor de soquete no UNIX pode ser passado para qualquer uma das funções de E/S de arquivo padrão (leitura e gravação, por exemplo).

Além disso, todos os identificadores no UNIX, incluindo identificadores de soquete, são inteiros pequenos e não negativos e alguns aplicativos pressupõem que isso será verdadeiro.

Os identificadores do Windows Sockets não têm restrições, exceto que o valor INVALID_SOCKET não é um soquete válido. As alças de soquete podem levar qualquer valor no intervalo de 0 a INVALID_SOCKET a 1.

Como o tipo SOCKET não está assinado, compilar o código-fonte existente de, por exemplo, um ambiente UNIX pode levar a avisos do compilador sobre incompatibilidades de tipo de dados assinados/não assinados.

Isso significa, por exemplo, que a verificação de erros quando as funções socket e accept retornam não deve ser feita comparando o valor retornado com –1 ou vendo se o valor é negativo (abordagens comuns e legais no UNIX). Em vez disso, um aplicativo deve usar a constante de manifesto INVALID_SOCKET conforme definido no arquivo de cabeçalho Winsock2.h . Por exemplo:

Estilo típico do BSD UNIX

s = socket(...);
if (s == -1)    /* or s < 0 */
    {/*...*/}

Estilo preferencial

s = socket(...);
if (s == INVALID_SOCKET)
    {/*...*/}

Portabilidade de aplicativos de soquete para Winsock

Considerações sobre programação winsock