Я пишу код для отправки сырых кадров 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
.
Но я не хочу, чтобы мой сервер слышал трафик, который не отправляется по указанному протоколу, поэтому это не решение. Как мне это сделать?
socket_address
? - person bstpierre   schedule 30.07.2010