ping localhost

ping 主机名

ping 主机IP

ping -a 主机IP

ping -t  主机IP

#include <iostream>
#include <cstdio>
#include <string>
#include <WinSock2.h>#pragma comment(lib, "ws2_32.lib")//winsock库using namespace std;struct ICMPheader
{unsigned char    byType;unsigned char    byCode;unsigned short    nChecksum;unsigned short    nId;unsigned short    nSequence;
};struct IPheader
{unsigned char    byVerLen; unsigned char    byTos; unsigned short    nTotalLength; unsigned short    nId; unsigned short    nOffset; unsigned char    byTtl; unsigned char    byProtocol; unsigned short    nChecksum; unsigned int    nSrcAddr; unsigned int    nDestAddr;
};unsigned short checkSum (char *pBuffer, int nLen)
{unsigned short nWord;unsigned int nSum = 0;int i;//Make 16 bit words out of every two adjacent 8 bit words in the packet//and add them upfor (i = 0; i < nLen; i = i + 2){nWord =((pBuffer [i] << 8)& 0xFF00) + (pBuffer [i + 1] & 0xFF);nSum = nSum + (unsigned int)nWord;    }//Take only 16 bits out of the 32 bit sum and add up the carrieswhile (nSum >> 16){nSum = (nSum & 0xFFFF) + (nSum >> 16);}//One's complement the resultnSum = ~nSum;return ((unsigned short) nSum);
}int main()
{string str_dest_addr;SOCKET sock_raw;SOCKADDR_IN dest_addr;SOCKADDR_IN from_addr;char sendBuffer[1024] = {0};char recvBuffer[1024] = {0};WSADATA wsaData;::WSAStartup(MAKEWORD(2,2), &wsaData);sock_raw = ::socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);int timeout = 1000;setsockopt(sock_raw, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));setsockopt(sock_raw, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout));dest_addr.sin_family = AF_INET;memset(&dest_addr.sin_zero, 0, 8);while( cout << "ping>"){cin >> str_dest_addr;int nSeq = 0;int nPacketSent = 0;int nPacketReceived = 0;int nTotalRoundTime = 0;int nMaxRoundTime = 0;int nMinRoundTime = -1;if((dest_addr.sin_addr.S_un.S_addr = inet_addr(str_dest_addr.c_str())) == INADDR_NONE){struct hostent *hp = NULL;if((hp = gethostbyname(str_dest_addr.c_str())) != NULL){memcpy(&(dest_addr.sin_addr), hp->h_addr_list[0],hp->h_length);}else{cout << "can not find the host!" << endl;continue;}}while( nPacketSent < 4){nPacketSent++;ICMPheader* pIcmpHeader = (ICMPheader*)sendBuffer;pIcmpHeader->byType = 8;pIcmpHeader->byCode = 0;pIcmpHeader->nId = (USHORT)::GetCurrentProcessId();pIcmpHeader->nChecksum = 0;pIcmpHeader->nSequence = htons(nSeq++);memset(sendBuffer + sizeof(ICMPheader), '*', 32);pIcmpHeader->nChecksum = htons(checkSum(sendBuffer, sizeof(ICMPheader) + 32));int nRet = sendto(sock_raw, sendBuffer, sizeof(ICMPheader) + 32, 0, (SOCKADDR*)&dest_addr, sizeof(SOCKADDR_IN));if(nRet == SOCKET_ERROR){cout << "send error:" << ::WSAGetLastError() << endl;break;}unsigned long dwSendTime = ::GetTickCount();int fromLen = sizeof(SOCKADDR_IN);nRet = recvfrom(sock_raw, recvBuffer, 1024, 0, (SOCKADDR*)&from_addr,&fromLen);if(nRet == SOCKET_ERROR){if(::WSAGetLastError() == WSAETIMEDOUT){cout << "Request time out" << endl;continue;}break;}IPheader* ipHdr = (IPheader*)recvBuffer;ICMPheader* icmpHdrRet = (ICMPheader*)(recvBuffer + sizeof(IPheader));if( icmpHdrRet->byCode == 0 &&icmpHdrRet->nId == pIcmpHeader->nId &&icmpHdrRet->nSequence == pIcmpHeader->nSequence){nPacketReceived++;unsigned long dwRecvTime = ::GetTickCount();int nRoundTime = dwRecvTime - dwSendTime;nTotalRoundTime += nRoundTime;if(nMinRoundTime == -1){nMinRoundTime = nRoundTime;nMaxRoundTime = nRoundTime;}if( nRoundTime < nMinRoundTime){nMinRoundTime = nRoundTime;}if( nRoundTime > nMaxRoundTime){nMaxRoundTime = nRoundTime;}cout << "Reply from " << inet_ntoa(from_addr.sin_addr) << ": bytes = " << nRet - sizeof(ICMPheader) - sizeof(IPheader) << ", time = " << nRoundTime << "ms, TTL = " << (int)ipHdr->byTtl << endl;}else{cout << "The echo reply is not correct!" << endl;}Sleep(1000);}cout << endl << "Ping statistics for " << inet_ntoa(from_addr.sin_addr) << ":" << endl << "\t" << "Packets:sent = " << nPacketSent << ", Received = "<< nPacketReceived << ", Lost = " << (nPacketSent - nPacketReceived) << "(" << ((float)(nPacketSent - nPacketReceived) /nPacketSent) * 100 << "% loss)" << endl;if(nPacketReceived){cout << "\rApproximate round trip times in milli-seconds:" << endl << '\t' << "Minimum = " << nMinRoundTime << "ms, Maximum = " << nMaxRoundTime << "ms, Average = " << (float)nTotalRoundTime /nPacketReceived << "ms" << endl;}}::closesocket(sock_raw);::WSACleanup();return 0;
}

ping命令 仿源码实现 以及几个 命令的 使用相关推荐

  1. linux下free源码,linux命令free源码解读:Procps free.c

    linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...

  2. 5单个编译总会编译全部_玩转Android10(五)源码编译开发中常用命令

    源码开发编译中,熟练掌握常用命令,可以提高开发工作效率.Android源码中,将相关的命令分为如下几类: 1.初始化源码编译环境 初始化编译环境,为后续提供如lunch.make.xxgrep.god ...

  3. Ubuntu下查看命令的源码

    主要利用dpkg和apt-get命令. 例如想要查看less命令的源码,可以在终端键入以下命令: [xx@xxxxxx]$ dpkg -S `whereis less`                ...

  4. 部署shiro官方源码时,执行maven命令出错

    转载自  部署shiro官方源码时,执行maven命令出错 部署shiro官方源码时,执行maven命令会报下面错误: [INFO] --------------------------------- ...

  5. android 代码发adb,Android预安装软件adb命令编译源码

    Android预安装软件&adb命令&编译源码 发布时间:2020-06-02 17:28:41 来源:51CTO 阅读:895 作者:年少的风 1.预安装软件: 将eclipse下的 ...

  6. 如何将镜像烧写至iNand(fastboot命令的源码分析)

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 参考博客 u-boot sdfuse命令烧录分析----从SD卡加载内核_white_bugs的博客-CSDN博客 一.将镜像文件烧写至iNan ...

  7. Redis源码-String:Redis String命令、Redis String存储原理、Redis String三种编码类型、Redis字符串SDS源码解析、Redis String应用场景

    Redis源码-String:Redis String命令.Redis String存储原理.Redis String三种编码类型.Redis字符串SDS源码解析.Redis String应用场景 R ...

  8. linux c free源码,linux命令free源码解读:Procps free.c

    linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...

  9. Django源码分析10:makemigrations命令概述

    django源码分析 本文环境python3.5.2,django1.10.x系列 django源码分析-makemigrations命令概述 Django项目中的数据库管理命令就是通过makemig ...

最新文章

  1. 《图解HTTP》笔记之TCP/IP
  2. 【Netty】Netty解决粘包和拆包问题的四种方案
  3. 关于windows对话框
  4. 【知识发现】基于物品的协同过滤推荐算法python实现
  5. bzoj 1146 [CTSC2008]网络管理Network
  6. SAP ABAP关键字在Chrome浏览器里高亮显示的实现原理 - How is ABAP keyword highlight implemented in Chrome
  7. jQuery上传插件-uploadify3.1使用说明
  8. C#序列化和反序列化代码总结
  9. 【LeetCode】剑指 Offer 53 - I. 在排序数组中查找数字 I
  10. 聚合(Aggregation)和组合(Composition)的区别
  11. 安卓手机抓包方法归纳总结
  12. java cropper 上传_基于cropper.js的图片上传和裁剪
  13. event mpm php,CentOS 7 安装 PHP-FPM 及使用 mod_mpm_event
  14. 为什么都说阿里 P7 的晋升是道坎?
  15. C. Mortal Kombat Tower(DP)
  16. mysql实验视图与索引_视图和索引(数据库实验4)【借鉴实操】
  17. 保研经历-清华计算机、北大、中科院计算所
  18. mui赋值_mui input用法
  19. 最新前端开发面试笔试题及答案---图片(面试题系列持续更新中)(4)
  20. VS2012 MFC + OpenCV

热门文章

  1. python 学堂在线_最新网课答案2020学堂在线Python 交互式程序设计导论
  2. nps browser0.95下载地址_飞兔跑腿app下载安装_飞兔跑腿软件最新版免费下载
  3. android 编程 输入矩阵,Android中Matrix的pre post set方法理解
  4. Linux学习笔记---移植官方uboot步骤(二)
  5. pytorch学习——基本优化思想与最小二乘法
  6. ostringstream 的清空数据方法
  7. Qt error LNK2001: unresolved external symbol
  8. 06_LR和最大熵模型_统计学习方法
  9. matlab 读写text文档
  10. 高仿富途牛牛-组件化(五)-如何去管理炒鸡多的小窗口