difusão UDP e unicast através do mesmo socket?
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?
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):
-
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
- Abra o soquete
-
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
- Permite transmissão de entrada e saída deste socket
-
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()
.