В общем в итоге я натравил на Pleora strace.
Ответ интересный (для меня):
Создается два сокета (с флагом REUSEADDR):
- с привязкой к IP адресу
- Без привязки к IP адресу, но с привязкой к порту полученному из первого сокета
Пакеты уходят через первый сокет, а читаются через второй.
<код из strace>
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.42.1")}, 16) = 0
setsockopt(3, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
getsockname(3, {sa_family=AF_INET, sin_port=htons(43861), sin_addr=inet_addr("192.168.42.1")}, [16]) = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
setsockopt(4, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(4, {sa_family=AF_INET, sin_port=htons(43861), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
sendto(3, "B\21\0\2\0\0P\1", 8, 0, {sa_family=AF_INET, sin_port=htons(3956), sin_addr=inet_addr("255.255.255.255")}, 16) = 8
nanosleep({0, 200000000}, NULL) = 0
recvfrom(4, "\0\0\0\3\0\370P\1\0\1\0\2\200\0\0\1\0\0\0\21\34\0\352C\0\0\0\7\0\0\0\7"..., 256, 0, {sa_family=AF_INET, sin_port=htons(3956), sin_addr=inet_addr("10.0.0.234")}, [16]) = 256