Pergunta

Eu tenho um aplicativo de Linux que abre um socket UDP e associa a um porto. Eu não tive qualquer problema ao enviar pacotes unicast através do soquete. Tive a oportunidade de enviar um pacote de broadcast, então eu habilitado SO_BROADCAST, o que permitiu que os pacotes de transmissão para passar, mas depois percebi que os pacotes unicast foram sendo transmitido também. É este o comportamento esperado para um socket UDP, ou é mais provável que eu mal configurado alguma coisa?

Foi útil?

Solução

Pelo que eu entendo SO_BROADCAST é uma opção tomada. Então, se você ativá-lo em sua tomada esta tomada será transmitido. Eu acho que você vai precisar para abrir sockets diferentes se você quer fazer unicast e transmissão a partir do mesmo código.

Outras dicas

Eu não tenho feito muito mãos sobre a programação aqui, mas você provavelmente precisará fornecer mais informações sobre a biblioteca, a versão OS, código, etc. Talvez um exemplo de código?

Se eu me lembro os livros que li, se você definir o sinalizador no soquete, que vai afetar todos os datagramas enviados da tomada, porque o soquete é uma basicamente uma estrutura de dados de bandeiras de rede + um descritor de arquivo.

Eu descobri o mesmo problema no Linux sobre ter uma tomada ficando unicast e transmissão, ao mesmo tempo. Eu resolvi o problema da seguinte forma (pseudo-código):

  1. sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
    • Abra o soquete
  2. setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
    • Permite transmissão de entrada e saída deste socket
  3. bind(sock, bindaddr, sizeof(struct sockaddr) com

bindaddr.sin_family = AF_INET

bindaddr.sin_port = <YourPort>

bindaddr.sin_addr.s_addr = INADDR_ANY

  • Obter todas as mensagens recebidas em qualquer cartão de <YourPort>

A ressalva é que não há filtragem (ver advertência em 3.). Então você vai ter todas as mensagens. As mensagens enviadas são ou unicast ou transmitido depedning no endereço indicado no sendto().

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