
		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).