ID do artigo: 131978 - Última revisão: quinta-feira, 22 de fevereiro de 2007 - Revisão: 3.3

Como receber/enviar difusões seletivas em WinNT/Win95 com WinSock

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

Este artigo descreve como um host pode se tornar membro de um grupo de difusão seletiva e receber e enviar pacotes de difusão seletiva com o Windows NT usando a interface Windows Sockets (WinSock).

Essa funcionalidade também está disponível com o Windows 95.

Mais Informações

Enviando datagramas de difusão seletiva de IP

Atualmente há suporte para difusão seletiva IP somente em soquetes AF_INET do tipo SOCK_DGRAM.

Para enviar um datagrama de difusão seletiva, especificar um IP endereço de difusão seletiva com um intervalo de 224.0.0.0 a 239.255.255.255 como o endereço de destino em um sendto() chamar.

Por padrão, IP datagramas de difusão seletiva são enviadas com um time-to-live (TTL) de 1, que impede que eles sejam encaminhadas além de uma sub-rede única. O código a seguir demonstra como alterar essa funcionalidade:

  int ttl = 7 ; // Arbitrary TTL value.

  setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl))
				
Datagramas de difusão seletiva com TTL de 0 não são transmitidas em qualquer sub-rede. Datagramas de difusão seletiva com TTL de maior do que um pode ser entregue a mais de uma sub-rede se houver um ou mais roteadores de difusão seletiva à sub-rede primeiro salto.

Um roteador de multicast não encaminha datagramas de difusão seletiva com endereços de destino entre 224.0.0.0 e 224.0.0.255, inclusive, independentemente de seus TTLs. Esse intervalo particular de endereços é reservado para o uso de protocolos de roteamento e outras topologia de baixo nível descoberta ou manutenção protocolos, como detecção de gateway e o relatório de participação no grupo. Cada transmissão de difusão seletiva é enviado de uma interface de rede único, mesmo se o host tiver mais de uma interface com capacidade para multicast. Uma opção de soquete está disponível para substituir o padrão para transmissões subseqüentes de um determinado soquete. Por exemplo
  unsigned long addr = inet_addr("157.57.8.1");
  setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,

            (char *)&addr, sizeof(addr))
				
onde "addr" é o endereço IP local da interface de saída desejado. Um endereço de INADDR_ANY pode ser usado para reverter para a interface padrão. Observe que esse endereço pode ser diferente do que o soquete é vinculado a.

Se um datagrama de difusão seletiva é enviado para um grupo ao qual o próprio host de envio pertence (na saída interface), por padrão, uma cópia do datagrama é auto-retornados volta pela camada de IP para entrega local. Em algumas versões do UNIX, há uma opção disponível para desativar esse comportamento (IP_MULTICAST_LOOP). Esta opção não tem suporte no Windows NT. Se você tentar desativar esse comportamento, a chamada falhará com o erro WSAENOPROTOOPT (opção de protocolo inválido).

Um datagrama de difusão seletiva enviado com um TTL inicial maior que 1 pode ser entregue ao host de envio em uma interface diferente do que no qual ele foi enviado, se o host pertencer ao grupo de destino em que outra interface. A opção de controle de auto-retorno não tem efeito na como entrega.

Recebimento de datagramas de difusão seletiva de IP

Antes de um host pode receber IP datagramas de difusão seletiva, ele deve se tornar membro de IP de um ou mais grupos de difusão seletiva. Um processo pode solicitar que o host para ingressar em um grupo de difusão seletiva usando o soquete seguinte opção
   struct ip_mreq mreq;
				
onde "mreq" é a seguinte estrutura:
   struct ip_mreq {


       struct in_addr imr_multiaddr;   /* multicast group to join */ 
       struct in_addr imr_interface;   /* interface to join on    */ 


   }
				
por exemplo:
        #define RECV_IP_ADDR   "225.6.7.8"  // arbitrary multicast address

        mreq.imr_multiaddr.s_addr = inet_addr(RECV_IP_ADDR);
        mreq.imr_interface.s_addr = INADDR_ANY;
        err = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                        (char*)&mreq, sizeof(mreq))
				
Observe que é necessário vincular a um endereço antes de chamar a função setsockopt().

Cada associação está associada com uma única interface, e é possível ingressar no grupo de mesmo em mais de uma interface. O endereço do "imr_interface" deve ser INADDR_ANY para escolher a interface de difusão seletiva padrão ou um dos endereços locais do host para escolher uma determinada interface (capaz de difusão seletiva).

O número máximo de membros é limitado apenas pela memória e placa de rede oferece suporte.

O exemplo de código a seguir pode ser usado para soltar uma associação
   struct ip_mreq mreq;
   setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,


             (char*)&mreq,sizeof(mreq))
				
onde "mreq" contém os mesmos valores usados para adicionar a associação. Os membros associados a um soquete também são ignorados quando o soquete é fechado ou o processo de manter o soquete é eliminado. No entanto, mais de um soquete pode solicitar uma participação em um determinado grupo, e o host permanece um membro desse grupo até que a última declaração for interrompida.

Os membros associados a um soquete não determinam necessariamente quais datagramas são recebidas por esse soquete. Pacotes de difusão seletiva de entrada são aceitas pela camada IP kernel se qualquer soquete tenha solicitado uma participação no grupo destino do datagrama; no entanto, entrega de um datagrama de difusão seletiva para um determinado soquete é baseada no destino porta (ou tipo de protocolo, para soquetes brutos), assim como acontece com datagramas de difusão ponto a ponto. Para receber datagramas multicast enviados para uma porta específica, é necessário vincular a essa porta local, deixando o endereço local não for especificado (isto é, INADDR_ANY).

Mais de um processo pode ligar para a porta UDP SOCK_DGRAM mesma se a chamada bind() é precedida pelo seguinte código:
   int one = 1;
   setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one))
				
nesse caso, cada entrada difusão seletiva ou de difusão UDP datagrama destinada a porta compartilhada é enviada para todos os soquetes vinculado a porta.

As definições necessárias para as opções de soquete de novo, de difusão seletiva estão localizadas no arquivo WINSOCK.H. Todos os endereços IP são passados em ordem de byte da rede.

Referências

O arquivo DOC\MISC\MULTICAST.TXT está incluído com o Win32 SDK.

A informação contida neste artigo aplica-se a:
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Win32 Software Development Kit (SDK) 3.5
  • Microsoft Win32 Software Development Kit (SDK) 3.51
  • Microsoft Windows 95
Palavras-chave: 
kbmt kbapi kbcode kbhowto kbnetwork kbwinsock KB131978 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 131978  (http://support.microsoft.com/kb/131978/en-us/ )