gpt4 book ai didi

c - 如何传输以太网帧?

转载 作者:行者123 更新时间:2023-11-30 19:47:23 25 4
gpt4 key购买 nike

我想向我的 friend 发送数据。我不知道他的IP地址。但我知道他的MAC地址。所以我必须使用以太网帧发送数据。

我写了一个程序,但它不工作。我不明白问题出在哪里?我哪里做错了?

客户端帧发送:

main()
{
int size ;
char req[10];
printf("enter to send\n");
gets(req);
int fd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP));
if (fd==-1)
{
perror("socket");
}

struct ifreq ifr;
char if_name[5]="eth0";
int if_name_len=strlen(if_name);
if (if_name_len<sizeof(ifr.ifr_name))
{
memcpy(ifr.ifr_name,if_name,if_name_len);
ifr.ifr_name[if_name_len]=0;
}
else
{
printf("interface name is too long");
}

if (ioctl(fd,SIOCGIFINDEX,&ifr)==-1)
{
perror("ioctl");
}
int ifindex=ifr.ifr_ifindex;
printf("ethernet interface id:%x\n",ifindex);

const unsigned char ether_broadcast_addr[]={0x00,0x1d,0x09,0x7a,0xDf,0x5e};

struct sockaddr_ll addr={0};

addr.sll_family=PF_PACKET;
addr.sll_ifindex=ifindex;
addr.sll_halen=ETHER_ADDR_LEN;
//addr.sll_protocol=htons(ETH_P_IP);
memcpy(&addr.sll_addr,ether_broadcast_addr,ETHER_ADDR_LEN);
addr.sll_hatype=772;
addr.sll_pkttype=PACKET_OUTGOING;

printf("size=%d\n",size);
if (size=sendto(fd,req,sizeof(req),0,(struct sockaddr*)&addr,sizeof(addr))==-1)
{
perror("sendto");
}
printf("send size=%d\n",size);

}

服务器端帧接收代码:

main()
{

int size;
char req[20];
int fd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
if (fd==-1)
{
perror("socket");
}

struct ifreq ifr;
char if_name[5]="eth0";
int if_name_len=strlen(if_name);
if (if_name_len<sizeof(ifr.ifr_name))
{
memcpy(ifr.ifr_name,if_name,if_name_len);
ifr.ifr_name[if_name_len]=0;
}
else
{
printf("interface name is too long");
}

if (ioctl(fd,SIOCGIFINDEX,&ifr)==-1)
{
perror("ioctl");
}
int ifindex=ifr.ifr_ifindex;
printf("ethernet interface id:%x\n",ifindex);

const unsigned char ether_broadcast_addr[]={0x00,0x1d,0x09,0x7a,0xDf,0x5e};

struct sockaddr_ll addr={0};

addr.sll_family=PF_PACKET;
addr.sll_ifindex=ifindex;
addr.sll_halen=ETHER_ADDR_LEN;
addr.sll_protocol=htons(ETH_P_ALL);
memcpy(&addr.sll_addr,ether_broadcast_addr,ETHER_ADDR_LEN);

addr.sll_pkttype=PACKET_OUTGOING;
addr.sll_hatype=772;

bind (fd, (struct sockaddr*)&addr, sizeof(addr));

printf("size=%d\n",size);
socklen_t a=sizeof(addr);
size=recvfrom(fd,req,sizeof(req),0,(struct sockaddr*)&addr,&a);
if(size==-1)
{
perror("recvfrom");
}
printf("size=%d\n",size);
printf("recv msg=%s\n",req);
}

最佳答案

虽然您的程序可以将数据帧发送到网络上,但它不会从那里到达任何地方。MAC 地址是非分层的,这意味着地址空间是平坦的。知道 MAC 地址并不能告诉您如何到达该地址。

拥有某人的 MAC 地址与拥有某人的姓名是一样的。您可能知道他们的名字,但您不能用我们的电话号码给他们打电话。现在,如果您知道他们的全名,就可以查找他们的电话号码。网络也类似。

网络数据(数据包)从您的计算机发送到默认网关,该网关是连接到 ISP 的 DSL 或电缆调制解调器。当它收到数据包时,它会查看 IP 地址来决定将其发送到何处。由于您的帧(没有 IP 地址的数据称为帧)没有 IP 地址,网关只会将其删除。更准确地说,由于它没有目标或源 IP 地址,因此它永远不会真正到达网关。它在网络上传输,但不对其执行任何操作。

关于c - 如何传输以太网帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22038837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com