UDP 브로드캐스트를 캡처하고 인쇄해야 하는 애플리케이션을 작성 중입니다. 사용되는 네트워크 인터페이스는 다음과 같습니다.
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.1 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::a00:27ff:feb9:b18c prefixlen 64 scopeid 0x20<link>
ether 08:00:27:b9:b1:8c txqueuelen 1000 (Ethernet)
다음 상태의 패킷이 성공적으로 수신 및 인쇄되었습니다.
$ sudo lsof -P -iUDP
python3 5496 root 3u IPv4 54675 0t0 UDP *:67
$ sudo strace python3 main.py 2>&1 | grep bind
bind(3, {sa_family=AF_INET, sin_port=htons(67), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
모든 주소가 아닌 특정 주소에 바인딩해야 합니다 0.0.0.0
. 그래서 0.0.0.0
동작을 시뮬레이션하고 루프를 실행하고 서브넷의 가능한 모든 주소에 바인딩하도록 스크립트를 변경했습니다 . 결과 :
$ sudo lsof -P -iUDP
python3 5472 root 3u IPv4 52392 0t0 UDP 192.168.10.0:67
python3 5472 root 4u IPv4 52393 0t0 UDP user-VirtualBox:67
python3 5472 root 6u IPv4 52647 0t0 UDP 192.168.10.255:67
그러나 앱은 여전히 아무것도 인쇄하지 않습니다.
질문
0.0.0.0
바인딩 가능한 모든 주소에 대한 바인딩과 바인딩 가능한 모든 주소에 대한 바인딩 사이에 차이점이 있습니까? 이로 인해 패키지가 사용자 공간 애플리케이션에 전달되지 않을 수 있습니까?
답변1
DHCP 클라이언트는 요청을 보내 255.255.255.255.67
므로 DHCP 서버가 이러한 요청을 받을 수 있는 개체를 수신하는 것이 좋습니다. 테스트에서 192.168.10.255:bootps
청취 주소와 동일한 항목 에 바인딩하십시오.확실히해당 패킷을 참조하세요.
존재하지 않는 것에 우리를 묶어두도록 강요하는 것은 무엇입니까 *:67
?