Здравствуйте, sakhnik, Вы писали:
S>Наткнулся на неприятнй сюрприз. На машине работает физический интерфейс eth0, а также создано ещё одно имя для него eth0:0 в той же подсетке. Некое приложетие привязывается к UDP сокету и отвечает на входные пакеты с IPADDR_ANY. Как оказалось, если пакет приходит с адреса интерфейса eth0:0, сокет почему-то отвечает, заполняя src_addr с eth0. Отсюда начинается куча проблем.
S>Значит:
S>S>client server
S>"hello" ------> eth0.0 (192.168.38.2)
S> <--X--- eth0 (192.168.38.1)
S>
S>В чём может быть дело? И как заставить сокет UDP использовать в качестве обратного адрес входящего пакета для отсылки ответа?
Кроссплатформенно это решается только созданием отдельного UDP сокета на каждый локальный IP. Так делают named, ntpd и прочие.
В BSD есть опции IP_RECVDSTADDR и IP_SENDSRCADDR, но авторы Linux решили, что это моветон, но замены не дали.