我坚持发送原始以太网帧。
[编辑]
我发现了一些错误。
1. 在套接字调用中它必须是 AF_PACKET。
2. AF_PACKET 没有 SOCK_PACKET 选项,但是 SOCK_DGRAM 和 SOCK_RAW
使用 SOCK_DGRAM,wireshark 捕获格式错误的 LLC 数据包。
但是使用 SOCK_RAW 没有错误消息,也没有捕获数据包。
我没有发现真正出了什么问题。
[/编辑]
编码:
if ((ethernet_socket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1)
cout << "Ethernet Socket: "<< strerror(errno) << endl;
struct sockaddr_ll socket_address;
socket_address.sll_family = PF_PACKET;
socket_address.sll_protocol = htons(ETH_P_IP);
socket_address.sll_ifindex=if_nametoindex("eth0");
socket_address.sll_hatype = 1; // ARPHRD_ETHER
socket_address.sll_pkttype = PACKET_OTHERHOST;
socket_address.sll_halen = ETH_ALEN;
memcpy(socket_address.sll_addr,dest_mac_addr,ETH_ALEN);
int send_result = 0;
char *opt=(char*)malloc(4*sizeof(char));
strcpy(opt,"eth0");
if(setsockopt(ethernet_socket, SOL_SOCKET, SO_BINDTODEVICE, opt, 4)==-1)
cout << "Could not bind socket to device: " << strerror(errno) << endl;
if ((send_result
= sendto(ethernet_socket, &buffer, sizeof(buffer), 0,
(struct sockaddr*)&socket_address, sizeof(socket_address)))==-1){
cout << "sendto error: "<< strerror(errno) << endl;
return send_result;
}
关于CK