단일 시스템에서 브로드캐스트 패킷을 테스트할 수 있습니까?

단일 시스템에서 브로드캐스트 패킷을 테스트할 수 있습니까?

나는 동일한 컴퓨터에서 브로드캐스트 UDP 패킷을 보내는 서버와 이를 수신하는 두 개의 다른 클라이언트를 갖고 싶습니다. 어떻게든 할 수 있을까? 어떤 IP 주소를 사용해야 합니까?


@gravyface는 나에게 희망을 주었지만 다음과 같이 시도했습니다.

  1. 서버는 127.255.255.255:54321로 전송하고 클라이언트는 0.0.0.0:54321을 수신합니다.
  2. 서버는 127.255.255.255:54321로 전송하고 클라이언트는 127.0.0.1:54321을 수신합니다.
  3. 서버는 127.255.255.255:54321로 전송하고 클라이언트는 127.255.255.255:54321을 수신합니다.

그들 중 누구도 일하지 않았습니다!:(

OBS: REUSE_ADDR 및 SO_BROADCAST 옵션을 사용하고 있습니다.

답변1

첫 번째 창:

socat -u udp-recv:12345,reuseaddr -

두 번째 창:

socat -u udp-recv:12345,reuseaddr -

세 번째 창

socat - udp-sendto:127.255.255.255:12345,broadcast

그런 다음 세 번째 창에 몇 줄의 텍스트를 입력하고 다른 두 창에 아무것도 표시되는지 확인하세요.

"socat"를 "strace -fe network socat"로 바꿔서 실제로 어떤 시스템 호출이 이루어지고 있는지 확인하세요(Linux를 사용한다고 가정하면 다른 unices에는 tusc, struss 또는 dtruss라고도 하는 상응하는 항목이 있습니다). socat은 오픈 소스이며 대부분의 운영 체제에서 바이너리 패키지를 사용할 수 있습니다.

socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
sendto(3, "qwe\n", 4, 0, {sa_family=AF_INET, sin_port=htons(12345), sin_addr=inet_addr("127.255.255.255")}, 16) = 4

위에서 수신 "클라이언트"는 INADDR_ANY 주소에 바인딩됩니다. 내가 찾은 이유는 루프백 서브넷의 주소에 바인딩하면 들어오는 패킷이 표시되지 않는다는 것입니다.

또한보십시오:

$ ip route show table local dev lo scope link
broadcast 127.0.0.0  proto kernel  src 127.0.0.1
broadcast 127.255.255.255  proto kernel  src 127.0.0.1

클라이언트가 127.0.0.0 또는 127.255.255.255에 바인딩되고 서버가 SO_BROADCAST를 사용하여 동일한 주소로 보내는 경우에도 작동합니다.

답변2

브로드캐스트 트래픽을 127.255.255.255로 보내는 중~해야 한다작동하지만 분명히 테스트해 보세요(여기서 Wireshark/tcpdump가 여러분의 친구입니다).

분명히 클라이언트도 루프백 장치에서 수신 대기해야 합니다.

관련 정보