Artigo: 131978 - Última revisão: quinta-feira, 22 de Fevereiro de 2007 - Revisão: 3.3

Como receber/enviar multicasts em WinNT/Win95 utilizar 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 | Reduzir tudo

Sumário

Este artigo descreve como um anfitrião se tornar membro de um grupo multicast e receber e enviar pacotes de multicast com o Windows NT utilizando a interface dos sockets do Windows (WinSock).

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

Mais Informação

Enviar datagramas de multicast IP

Multicast IP é suportado apenas em sockets AF_INET do tipo SOCK_DGRAM.

Para enviar um datagrama multicast, especificar uma IP endereço multicast com um intervalo de 224.0.0.0 a 239.255.255.255 como o endereço de destino de uma sendto() contacte.

Por predefinição, IP datagramas de multicast são enviadas com um tempo de vida (TTL) de 1, que impede que sejam reencaminhadas para além de uma única sub-rede. O seguinte código demonstra como alterar esta funcionalidade:

  int ttl = 7 ; // Arbitrary TTL value.

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

Um router multicast não encaminha datagramas de multicast com endereços de destino entre 224.0.0.0 e 224.0.0.255, inclusive, independentemente do respectivo TTL. Este intervalo de endereços específico está reservado para a utilização de protocolos de encaminhamento e de outras topologia de baixo nível identificação ou manutenção protocolos, tais como a detecção de gateway e relatório de membros do grupo. Cada transmissão multicast é enviado da interface de rede único, mesmo se o anfitrião tiver mais do que uma interface com capacidade multicast. Uma opção de socket está disponível para substituir a predefinição para transmissões subsequentes de um determinado socket. Por exemplo
  unsigned long addr = inet_addr("157.57.8.1");
  setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,

            (char *)&addr, sizeof(addr))
				
onde "endereço" é o local endereço IP da interface de saída pretendido. Um endereço de INADDR_ANY pode ser utilizado para reverter para a interface predefinida. Note que este endereço poderá ser diferente do socket está ligado.

Se for enviado um datagrama multicast a um grupo ao qual pertence o anfitrião emissor próprio (na saída interface), por predefinição, uma cópia do datagrama é loopback novamente pela camada IP para entrega local. Em algumas versões do UNIX, existe uma opção disponível para desactivar este comportamento (IP_MULTICAST_LOOP). Esta opção não é suportada no Windows NT. Se tentar desactivar este comportamento, a chamada falhará com o erro WSAENOPROTOOPT (opção de protocolo incorrecto).

Um datagrama multicast enviado com um TTL inicial maior que 1 pode ser entregue ao anfitrião emissor numa interface diferente do que em que foi enviada, se o anfitrião pertencer ao grupo de destino em que outra interface. A opção de controlo de loopback não tem efeito no tal entrega.

Recepção de datagramas de multicast IP

Antes de um anfitrião pode receber IP datagramas multicast, deve tornar-se um membro de IP de um ou mais grupos multicast. Um processo pode peça ao anfitrião para aderir a um grupo multicast utilizando o socket 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))
				
Note que é necessário ligar a um endereço antes de chamar a função setsockopt().

Todos os membros está associado uma única interface e é possível aderir ao grupo mesmo mais do que uma interface. O endereço de "imr_interface" deve ser INADDR_ANY para escolher a interface de multicast predefinido ou um dos endereços locais do anfitrião para escolher uma determinada interface (a capacidade de utilizar multicast).

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

É possível utilizar o seguinte exemplo de código para largar uma adesão
   struct ip_mreq mreq;
   setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,


             (char*)&mreq,sizeof(mreq))
				
em que "mreq" contém os mesmos valores utilizado para adicionar os membros. Os membros associados a um socket também são ignorados quando o socket está fechado ou o processo que detém o socket foi cancelado. No entanto, mais do que um socket poderá pedir uma adesão a um determinado grupo e o anfitrião permanece um membro desse grupo até cair a afirmação última.

Os membros associados a um socket não determinam necessariamente as datagramas são recebidas por esse socket. Pacotes multicast recebidos são aceites pela camada IP kernel se qualquer socket tem pediu uma adesão no grupo de destino do datagrama; no entanto, a entrega de um datagrama multicast para um determinado socket é baseada no destino porta (ou tipo de protocolo para raw sockets), tal como com datagramas unicast. Para receber datagramas multicast enviados para uma determinada porta, é necessário ligar a essa porta local, deixando o endereço local não for especificado (ou seja, INADDR_ANY).

Mais do que um processo pode ligar a mesma porta de UDP SOCK_DGRAM se a chamada bind() for antecedida pelo seguinte código:
   int one = 1;
   setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one))
				
neste caso, cada entrada multicast ou de difusão UDP datagrama destinada para a porta partilhada é entregue a todos os sockets vinculado a porta.

As definições necessárias para as opções de socket de novo, de multicast estão localizadas no ficheiro WINSOCK.H. Todos os endereços IP são transmitidos na ordem de bytes de rede.

Referências

O ficheiro DOC\MISC\MULTICAST.TXT é incluído com o SDK do Win32.

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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )