简介
使用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