libuv实现ping包发送和接收

目录

简介

使用socket函数创建套接字,并与uv_udp_t关联,可以实现对icmp包的发送和接收,实现类似ping命令的功能。

	uv_loop_t* loop = uv_default_loop();
	uv_udp_t* pUdp = new uv_udp_t;
	int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    uv_udp_init(loop, pUdp);
    uv_udp_open(pUdp, sock);

源码

学习icmp协议和libuv关于udp,定时器的使用。

创建了ICMP的套接字,并与uv_udp_t关联
创建一个定时器,并与uv_udp_t关联,用于处理响应超时
构造并发送一个icmp包req
收到icmp包rsp,打印响应内容,关闭定时器,关闭uv_udp_t句柄
超时未收到rsp,打印超时,关闭uv_udp_t句柄,关闭定时器

需要注意的是:由于套接字协议是IPPROTO_ICMP,收到的包是包含IP头的。

//
/*
在入口函数中包含 _CrtDumpMemoryLeaks();  
即可检测到内存泄露
*/
#define CRTDBG_MAP_ALLOC  
#include <stdlib.h>  
#include <crtdbg.h>  
//
//#include <conio.h>    //for kbhit()
#include "stdafx.h"
#include "uv.h"

#pragma pack(1)

#define ICMP_ECHOREPLY  0
#define ICMP_ECHOREQ    8
#define REQ_DATASIZE    32     // Echo 请求数据的大小
// IP Header -- RFC 791
typedef struct tagIPHDR
{
   
    u_char      VIHL;          // Version and IHL
    u_char      TOS;           // Type Of Service
    short       TotLen;        // Total Length
    short       ID;            // Identification
    short       FlagOff;       // Flags and Fragment Offset
    u_char      TTL;           // Time To Live
    u_char      Protocol;      // Protocol
    u_short     Checksum;      // Checksum
    struct    in_addr iaSrc;   // Internet Address - Source
    struct    in_addr iaDst;   // Internet Address - Destination
}IPHDR, *PIPHDR;

// ICMP Header - RFC 792
typedef struct tagICMPHDR
{
   
    u_char    Type;            // Type
    u_char    Code;            // Code
    u_short   Checksum;        // Checksum
    u_short   ID;              // Identification
    u_short   Seq;             // Sequence
    char      Data;            // Data
}ICMPHDR, *PICMPHDR;

// ICMP Echo Request
typedef struct tagECHOREQUEST
{
   
    ICMPHDR   icmpHdr
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值