Есть несколько возможных способов сделать это. Свяжите отдельный сокет на каждом IP на каждом физическом интерфейсе, тогда вы всегда будете знать, на какой интерфейс поступил пакет. Вы также можете попробовать флаг IP_RECVIF вместе с функцией сокета recvmsg, хотя я не знаю, поддерживается ли это в Windows. У Стивена есть примеры в Разделах 22.2 и 22.6 Сетевого программирования Unix. Вы можете использовать флаг SIOCGIFCONF с ioctl, чтобы получить список интерфейсов на машине. В разделе 17.6 УНП приведен пример программы. Если c # не предоставляет вам доступ к этим функциям, но они поддерживаются в Windows, вы можете написать простую программу на C для сбора и обновления информации об интерфейсе / IP, а затем использовать mmap для разделения области памяти между вашей программой C # и перечислителем интерфейса.