Когда nc
прослушивает сокет UDP, он «привязывается» к исходному порту и исходному IP-адресу первого полученного пакета. Проверьте этот след:
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(10000), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
recvfrom(3, "f\n", 2048, MSG_PEEK, {sa_family=AF_INET, sin_port=htons(52832), sin_addr=inet_addr("127.0.0.1")}, [16]) = 2
connect(3, {sa_family=AF_INET, sin_port=htons(52832), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
Здесь вы можете видеть, что он создал сокет UDP, настроил его для повторного использования адреса и привязал его к порту 10000. Как только он получил свою первую дейтаграмму (от порта 52 832), он выпустил системный вызов connect
, «соединяющий» ее с 127.0.0.1:52 832. Для UDP connect
отклоняет все пакеты, которые не соответствуют IP-адресу и порту в connect
.