Я пишу это как отдельный ответ, так как детали полностью отличаются от того, что я написал ранее.
Итак, основываясь на комментарии Kalmi об идентификаторе сеанса, я подумал о том, почему я могу открыть две программы ping на одной машине, и ответы не пересекаются. Они оба ICMP, поэтому оба используют необработанные сокеты без портов. Это означает, что что-то в стеке IP должно знать, для какого сокета предназначались эти ответы. Для проверки связи выясняется, что в данных пакета ICMP используется идентификатор, являющийся частью ECHO REQUEST и ECHO REPLY.
Затем я наткнулся на этот комментарий в Википедии о ICMP :
Хотя сообщения ICMP содержатся
в рамках стандартных дейтаграмм IP, ICMP
сообщения обычно обрабатываются как
особый случай, отличающийся от
обычная обработка IP, а не
обрабатывается как обычный подпротокол
IP. Во многих случаях необходимо
проверить содержимое ICMP
сообщение и доставить соответствующий
сообщение об ошибке в приложении, которое
сгенерировал исходный IP-пакет,
тот, который вызвал отправку
ICMP-сообщение.
Который был разработан (косвенно) здесь :
Интернет-заголовок плюс первые 64
биты исходных данных дейтаграммы.
Эти данные используются хостом для соответствия
сообщение соответствующему
процесс. Если протокол более высокого уровня
использует номера портов, предполагается, что они
быть в первых 64 битах данных
исходные данные дейтаграммы.
Поскольку вы используете UDP, который использует порты, возможно, сетевой стек перенаправляет сообщение ICMP обратно в исходный сокет. Вот почему ваш новый отдельный сокет никогда не получает эти сообщения. Я полагаю, UDP использует ICMP-сообщение.
Если я прав, одно из решений этого - открыть необработанный сокет и вручную создать ваши UDP-пакеты, прослушать все, что возвращается, и обработать сообщения UDP и ICMP соответствующим образом. Я не уверен, как это будет выглядеть в коде, но я не думаю, что это будет слишком сложно и может считаться более «элегантным», чем решение winpcap.
Кроме того, эта ссылка http://www.networksorcery.com/enp/default1003.htm, представляется отличным ресурсом для сетевых протоколов низкого уровня.
Надеюсь, это поможет.