//send.c
#include <stdio.h>
#include <stdlib.h> //perror
#include <string.h> //strcpy,memset
#include <sys/socket.h> //socket
#include <sys/ioctl.h> //ioctl
#include <net/if.h> //ifreq
#include <linux/if_packet.h> //sockaddr_sll
#include <linux/if_ether.h> //ETH_P_ALL
#define IFRNAME0 "eth0"
#define IFRNAME1 "eth1"
#define BUF_SIZE 2048
//unsigned char buf[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
unsigned char buf[100] = {0x00, 0x90, 0x0B, 0x22, 0xA0, 0xEB, 0x00, 0x90, 0x0B, 0x22, 0xA0, 0xEA, 0x51, 0x52, 0x41, 0x42, 0x43, 0x33, 0x34, 0x35, 0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A};
unsigned char source_mac[6];
unsigned char dest_mac[6];
int main(int argc, char *argv[])
{
int i, sfd, len;
struct sockaddr_ll sll;
struct ifreq ifr;
if ((sfd=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
perror("socket");
return 0;
}
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, IFRNAME0);
if ((ioctl(sfd, SIOCGIFINDEX, &ifr)) == -1) {
strcpy(ifr.ifr_name, IFRNAME1);
if ((ioctl(sfd, SIOCGIFINDEX, &ifr)) == -1) {
perror("ioctl 1");
close(sfd);
return 0;
}
}
memset(&sll, 0, sizeof(sll));
sll.sll_family = PF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons(ETH_P_ALL);
if ((bind(sfd, (struct sockaddr *)&sll, sizeof(sll))) == -1) {
perror("bind");
close(sfd);
return 0;
}
while (1) {
len = sizeof(buf);
sendto(sfd, buf, len, 0, (struct sockaddr *)&sll, sizeof(sll));
/*
printf("send data2: %d\n", len);
for(i=0; i<len; i++)
printf("%x", buf[i]);
printf("\n");
*/
sleep(1);
//i++;
//break;
}
close(sfd);
return 1;
}
//recv.c
#include <stdio.h>
#include <stdlib.h> //perror
#include <string.h> //strcpy,memset
#include <sys/socket.h> //socket
#include <sys/ioctl.h> //ioctl
#include <net/if.h> //ifreq
#include <linux/if_packet.h> //sockaddr_sll
#include <linux/if_ether.h> //ETH_P_ALL
#define IFRNAME0 "eth0"
#define IFRNAME1 "eth1"
#define BUF_SIZE 2048
unsigned char buf[BUF_SIZE];
int main(int argc, char *argv[])
{
int i, sfd, len;
struct sockaddr_ll sll;
struct ifreq ifr;
if ((sfd=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
perror("socket");
return 0;
}
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, IFRNAME1);
if ((ioctl(sfd, SIOCGIFINDEX, &ifr)) == -1) {
strcpy(ifr.ifr_name, IFRNAME0);
if ((ioctl(sfd, SIOCGIFINDEX, &ifr)) == -1) {
perror("ioctl 1");
close(sfd);
return 0;
}
}
memset(&sll, 0, sizeof(sll));
sll.sll_family = PF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons(ETH_P_ALL);
int length = sizeof(sll);
if ((bind(sfd, (struct sockaddr *)&sll, sizeof(sll))) == -1) {
perror("bind");
close(sfd);
return 0;
}
while (1) {
len = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr *)&sll, &length);
//printf("recv data2: %d\n", len);
if (len > 0 ) {
printf("recv data2: %d\n", len);
for(i=0; i<len; i++)
printf("%x", buf[i]);
//printf("%c", buf[i]);
printf("\n");
}
}
close(sfd);
return 1;
}
Wireshark 完整截图如下:::