educoder -- IP协议解析

本文将指导你实现IP数据包解析,包括获取源IP、目的IP、总长度和数据长度,并演示如何计算并验证数据包的校验和,以确保数据传输的准确性。使用C语言代码实例解析以太网帧中的关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务描述

本次实验的目标主要分为两部分
1.实现对IP数据包的内容进行解析,获取IP地址、数据包长度等信息
2.实现对IP数据包内容的校验,确认收到的数据是正确可靠的

任务目标

获取IP包中的源地址
获取IP包中的目的地址
获取IP包总长度
计算IP包的数据长度
计算校验和
注意事项!!!
第五个任务要实现的是返回计算IP数据包后的校验和,而非IP包本身的校验和,即:
模拟设备收到IP包后对数据进行校验

#include"network_protocol.h"
/*从以太网帧中获取ip包的源地址,以网络字节顺序返回 */
uint32 get_src_ip(byte *eth){
/********* Begin 1 ***************/
// uint32 num = (eth[12] << 0) + (eth[13] << 8) + (eth[14] << 16) + (eth[15] << 24);
uint32 num = eth[26] + (eth[27] << 8) + (eth[28] << 16) + (eth[29] << 24);
return num;
// return eth[12];
/********** End 1 *****************/

}
/*从以太网帧中获取ip包的目的地址,以网络字节顺序返回 */
uint32 get_dst_ip(byte *eth){
/********* Begin 2 ***************/
uint32 num = eth[30] + (eth[31] << 8) + (eth[32] << 16) + (eth[33] << 24);
return num;
/********** End 2 *****************/
}
/*从以太网帧中获取ip包的总长度,以本地节顺序返回 */
short get_ip_total_len(byte *eth){
/********* Begin 3 ***************/
return eth[17];
/********** End3*****************/
}
/*从以太网帧中获取ip包的数据长度,以本地节顺序返回 */
short get_ip_data_len(byte *eth){
/********* Begin 4 ***************/
return eth[17] - 20;
/********** End 4 *****************/
}

/*计算以太网帧中的ip包首部检验,以本地节顺序返回 */  
uint16    ipcksum( struct IpPkt* ip){  
    uint16    *hptr;            /* Ptr to 16-bit header values    */  
    int32    i;            /* Counts 16-bit values in hdr    */  
    uint16    word;            /* One 16-bit word        */  
    uint32    cksum;            /* Computed value of checksum    */
    hptr= (uint16 *) ip;
    /* Sum 16-bit words in the packet */
    cksum = 0;  
    for (i=0; i<10; i++) {  
        word = *(hptr+i);  
        cksum += (uint32) ntohs(word);  
    }
    /* Add in carry, and take the ones-complement */
    cksum = (cksum >> 16) + (cksum&0xffff);  
    cksum += (cksum >> 16);
    return (uint16) (0xffff & ~cksum);  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值