Primeiro, deixe-me descrever o problema brevemente. Eu tenho dois programas que enviam pacotes IP de um host (192.168.0.101) para outro host (192.168.0.106). Esses dois programas são escritos respectivamente com C e C ++, mas possuem as mesmas funcionalidades.
Se eu executar o programa em C, quando um soquete bruto for enviar pacotes IP (o programa faz o pacote IP sem cabeçalho MAC / Ethernet) com o IP de destino 192.168.0.106, dos pacotes capturados pelo tcpdump, host transmitir uma consulta ARP para o MAC de 192.168.0.106, e assim ele pode entregar com sucesso os pacotes para aquele host.
Se eu executar o programa C ++, ele não transmitirá o ARP para consultar o MAC de 192.168.0.106 e adicionará um cabeçalho MAC errado aos pacotes IP e, assim, o desenvolverá para o host errado (que também está se comunicando com o host 192.168.0.101 nos cenários dos programas C e C ++)
Estou realmente confuso com o fato de que a transmissão ARP acontece no primeiro cenário, mas não no segundo cenário, há alguma razão potencial para tal diferença? por que o sistema não faz a transmissão de solicitação ARP no segundo cenário, levando a uma entrega errada?
Longa história:
Eu tenho três laptops em uma WLAN, A e C usam wlan0, mas B está conectado ao roteador sem fio via cabo e usa eth0.
Eu escrevi um programa em C para fazer um experimento de seqüestro de TCP e, em seguida, modifiquei-o para o programa C ++.
Após algumas investigações, notei que é devido ao endereço MAC. Quando o programa C ++ é executado, o kernel / sistema adiciona o endereço MAC de B como MAC de destino aos pacotes de spoofing de IP (espera-se que o kernel adicione o endereço MAC de A porque o endereço IP de destino é de A). No entanto, escrevi pacotes no nível IP e usei um soquete bruto como abaixo no programa C e no programa C ++:
send_sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW));
...
sendto(send_sd, packet, ip_len, 0, (struct sockaddr*)&client_addr, addr_len);
É estranho que quando eu corri estes dois programas, o kernel / sistema adicionou diferentes endereços MAC de destino. Quais são as possíveis causas?