C++实现简易的 ping
ping 的实现
- ping 是基于 ICMP 协议实现的,而 ICMP 协议又是基于 IP 协议实现的(ICMP作为IP协议的数据部分传输)
- ping 通过 ICMP 协议中的 type=8 和 code=0 来实现的,这个 type 和 code 的组合在 ICMP 协议中表示请求回显。如果能正常回显,那么返回的 ICMP 协议包中的类型是类型0,表示回显成功。
- IP 协议的头部一般为 20 个字节
更多细节请看:
聊聊实现C++跨平台ping函数及ICMP请求回显数据包解析
demo
#ifdef _WIN32
#include <WinSock2.h>
#pragma comment(lib, "WS2_32")
struct WindowsSocketLibInit
{
WindowsSocketLibInit()
{
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
WSAStartup(sockVersion, &wsaData);
}
~WindowsSocketLibInit()
{
WSACleanup();
}
} INITSOCKETGLOBALVARIABLE;
#else
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <ctime>
#include <cstdlib>
#include <cstdint>
#include <cstring>
#endif
#include <string>
#include <limits>
short getChecksum(unsigned short