Я пишу код для отправки необработанных кадров Ethernet между двумя блоками Linux.Чтобы проверить это, я просто хочу получить простую отправку клиентом и получение сервером.
У меня есть клиент, правильно создающий пакеты (я могу видеть их, используя анализатор пакетов).
Нана стороне сервера я инициализирую сокет следующим образом:
fd = socket(PF_PACKET, SOCK_RAW, htons(MY_ETH_PROTOCOL));
, где MY_ETH_PROTOCOL
- это 2-байтовая константа, которую я использую как ethertype, поэтому я не слышу посторонний сетевой трафик.
, когда япривязать этот сокет к моему интерфейсу, я должен снова передать ему протокол в структуре socket_addr: socket_address.sll_protocol = htons(MY_ETH_PROTOCOL);
Если я скомпилирую и выполню код, подобный этому, то произойдет сбой.Мой сервер не видит пакет.Однако, если я изменю код следующим образом:
socket_address.sll_protocol = htons(ETH_P_ALL);
Сервер сможет увидеть пакет, отправленный клиентом (а также многие другие пакеты), поэтому я должен выполнить некоторую проверку пакета, чтобы увидеть, чтоэто соответствует MY_ETH_PROTOCOL
.
Но я не хочу, чтобы мой сервер слышал трафик, который не отправляется по указанному протоколу, поэтому это не решение.Как мне это сделать?