paulo1205
(usa Ubuntu)
Enviado em 19/12/2015 - 14:59h
Você vai precisar criar um socket do tipo SOCK_RAW. Essa operação requer execução como root ou com o privilégio
CAP_NET_RAW.
Na hora de enviar datagramas com
sendto() (ou de criar um circuito virtual com
connect()), você pode escolher uma família de endereços como
AF_INET ou
AF_INET6. Nesse caso -- e até onde me lembro --, o kernel vai verificar se o datagrama que você tenta mandar é válido ou não, e pode se recusar a enviar uma mensagem mal formatada no nível de IP ou IPv6, mesmo sendo um
raw socket. Por outro lado, se você usar como família de endereços
AF_PACKET, então você vai realmente poder enviar qualquer coisa que possa trafegar via Ethernet.
EDIT: O que eu disse acima foi meio de memória, e meio consultando rapidamente a manpage de
socket(2). Lendo mais a fundo, as versões mais novas do kernel suportam outras operações e combinações de tipo de socket (na chamada que cria o socket) e família de endereços (na recepção e envio de pacotes/datagramas), dando mais flexibilidade para você. Recomendo a leitura das manpages
socket(2),
socket(7) e
packet(7).