网络协议栈设计(八)---网络层ARP协议代码实现(发送)

网络协议栈设计(八)

//Network_ARP_send.h

#pragma once
#include"Header_Include.h"

struct arp_pkt
{
    u_int16_t hardware_type;
    u_int16_t protocol_type;
    u_int8_t hardware_addr_length;
    u_int8_t protocol_addr_length;
    u_int16_t op_code;
    u_int8_t source_mac[6];
    u_int8_t source_ip[4];
    u_int8_t destination_mac[6]; 
    u_int8_t destination_ip[4];
};


/*
if the needer mac addr is not in arp_table, so request 
*/
void load_arp_packet(u_int8_t *destination_ip);
void network_arp_send(u_int8_t *destination_ip, u_int8_t *ethernet_dest_mac);
//Network_ARP_send.cpp

#include"Network_ARP_send.h"
#include"Ethernet.h"
#include"Resource.h"

extern u_int8_t local_mac[6];
extern u_int8_t local_ip[4];
extern int ethernet_upper_len;

u_int8_t arp_buffer[MAX_SIZE];


void load_arp_packet(u_int8_t *destination_ip)
{
    struct arp_pkt *arp_packet = (struct arp_pkt *)(arp_buffer);
    arp_packet->hardware_type = htons(ARP_HARDWARE);
    arp_packet->protocol_type = htons(ETHERNET_IP);
    arp_packet->hardware_addr_length = 6;
    arp_packet->protocol_addr_length = 4;
    arp_packet->op_code = htons(ARP_REQUEST);
    int i;
    for (i = 0; i < 6; i++)
    {
        arp_packet->source_mac[i] = local_mac[i];
    }
    for (i = 0; i < 4; i++)
    {
        arp_packet->source_ip[i] = local_ip[i];
    }

    for (i = 0; i < 6; i++)
    {
        //arp请求报文此字段设置为全0
        arp_packet->destination_mac[i] = 0x00;
    }
    for (i = 0; i < 4; i++)
    {
        arp_packet->destination_ip[i] = destination_ip[i];
    }
}


void network_arp_send(u_int8_t *destination_ip, u_int8_t *ethernet_dest_mac)
{
    load_arp_packet(destination_ip);

    ethernet_upper_len = sizeof(struct arp_pkt);
    ethernet_send_packet(arp_buffer,ethernet_dest_mac, ETHERNET_ARP);
}

ARP发送实现起来比较简单,下一篇我们带来ARP接收数据包分析。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值