Кроме открытия отдельного сокета на каждом интерфейсе, как предложил Гломек, единственный способ, которым я знаю, чтобы сделать это окончательно в Windows, - это использовать необработанный сокет, например,
SOCKET s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
Каждый прием от этого сокета будет IP-пакетом , который содержит адреса источника и назначения. Программа, над которой я работаю, требует, чтобы я перевел сокет в беспорядочный режим, используя опцию SIO_RCVALL. Это означает, что я получаю каждый IP-пакет, который интерфейс «видит» в сети. Чтобы извлечь пакеты специально для моего приложения, я должен отфильтровать данные, используя адреса и порты в заголовках IP и TCP / UDP. Очевидно, что это, вероятно, больше издержек, чем вам интересно. Я только говорю об этом, чтобы сказать это - я никогда не использовал необработанный сокет, не переводя его в беспорядочный режим. Поэтому я не уверен, можете ли вы связать его с INADDR_ANY и просто использовать его как обычный сокет с этого момента или нет. Мне кажется, что вы можете; Я просто никогда не пробовал.
РЕДАКТИРОВАТЬ: Прочитайте эту статью для ограничений, касающихся необработанных сокетов в Windows. Самым большим препятствием, с которым я столкнулся в своем проекте, было то, что нужно быть членом группы администраторов, чтобы открыть необработанный сокет в Windows 2000 и более поздних версиях.