동일한 소켓을 통해 UDP 방송 및 유니 캐스트?
문제
UDP 소켓을 열고 포트에 바인딩하는 Linux 응용 프로그램이 있습니다. 소켓을 통해 유니 캐스트 패킷을 보내는 데 아무런 문제가 없었습니다. 방송 패킷을 보낼 기회가 있었기 때문에 Broadcast 패킷을 통과 할 수있는 So_broadcast를 활성화했지만 유니 캐스트 패킷도 방송되고 있음을 알았습니다. UDP 소켓에 대한이 행동이 예상되는 행동입니까, 아니면 무언가를 잘못 구성했을 가능성이 더 높습니까?
해결책
내가 이해하는 것에서 so_broadcast 소켓 옵션입니다. 따라서 소켓에서 활성화하면이 소켓은 방송됩니다. 유니 캐스트를하고 동일한 코드에서 방송하려면 다른 소켓을 열어야한다고 생각합니다.
다른 팁
여기서 프로그래밍에 많은 손을 대지 않았지만 라이브러리, OS 버전, 코드 등에 대한 자세한 정보를 제공해야 할 것입니다. 코드 샘플일까요?
내가 읽은 책을 기억한다면, 소켓에 플래그를 설정하면 소켓에서 전송 된 모든 데이터 그램에 영향을 미칩니다. 소켓은 기본적으로 네트워크 플래그 + 파일 디스크립터의 데이터 구조이기 때문입니다.
나는 소켓이 유니 캐스트를 받고 동시에 방송되는 것에 대해 Linux에서 같은 문제를 알아 냈습니다. 다음과 같이 문제를 해결했습니다 (의사 코드) :
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
- 소켓을 엽니 다
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
- 이 소켓에서 들어오고 나가는 방송을 허용합니다
bind(sock, bindaddr, sizeof(struct sockaddr)
~와 함께
bindaddr.sin_family = AF_INET
bindaddr.sin_port = <YourPort>
bindaddr.sin_addr.s_addr = INADDR_ANY
- 모든 카드에 들어오는 메시지를 받으십시오
<YourPort>
경고는 필터링이 없다는 것입니다 (3의 경고 참조). 그래서 당신은 모든 메시지를 얻을 것입니다. 전송 된 메시지는 주어진 주소에 대해 단일 캐스트 또는 방송되어 있습니다. sendto()
.