C语言实现PING功能

网络协议分析的一次实验题:ping的原理不再赘述了,直接上代码吧
注:需要ws2_32支持
下载地址:http://download.csdn.net/detail/mass_effect/9867576

#include <iostream>
#include <stdio.h>
#include <WINSOCK2.H>
#include <windows.h>

using namespace std;

//ICMP回送回应报文类型
#define ECHO_REPLY 0
//ICMP回送请求报文类型
#define ECHO_REQUEST 8

//ip首部数据结构
struct Ip_Header {
    //首部长度和版本,高4位为首部长度,低4位为版本
    unsigned char ip_verlen;
    //服务类型/区分服务
    unsigned char ip_tos;
    //总长度
    unsigned short ip_total_len;
    //标识
    unsigned short ip_id;
    //标志&分片偏移 高3位为标志
    unsigned short ip_fragoff;
    //生存时间
    unsigned char ip_ttl;
    //协议
    unsigned char ip_proto;
    //校验和
    unsigned short ip_cksum;
    //源ip地址
    unsigned long ip_src_IP;
    //目的ip地址
    unsigned long ip_dst_IP;
};

//icmp 回送请求和应答报文数据结构
struct Icmp_Header {
    //类型
    unsigned char icmp_type;
    //代码
    unsigned char icmp_code;
    //校验和
    unsigned short icmp_cksum;
    //标识
    unsigned short icmp_id;
    //序列号
    unsigned short icmp_seq;
    //数据部分,这里使用了时间戳
    unsigned long icmp_data;
};

//计算校验和,注意传入的是unsigned char数组, 所以需要两两合并才进行求和
unsigned short checkSum(unsigned char *buffer,int size){
    unsigned long cksum = 0;
    unsigned long tmp;
    while(size>1){
        //以16位为单位相加
        tmp = *buffer++ << 8;
        tmp += *buffer++;
        cksum += tmp;
        size-=sizeof(unsigned short);
    }
    if(size) {
        
  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值