找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 74605|回复: 30

控制台彩色PING工具ping2发布

[复制链接]
发表于 2017-5-21 18:16:40 | 显示全部楼层 |阅读模式
ping2 [version 1.0]
链接: https://pan.baidu.com/s/1bcWjKbh3Gz1icXkbRdrczg?pwd=r5d9
一个可以取代微软ping的命令行工具,具有比ping更灵活的开关解析,更精准的信息反馈,引入了品率来描述一个ping质量的等级。核心层完全依据反汇编ping模仿,使用同样的API和程序流程,源码兼容单、款字符,兼容gcc,vs各类编译器。建议复制代码自行编译,以获取最佳品质的ping2.exe。

PING2.EXE  (CONSOLE PING TOOL, BY LEO, VERSION 1.0)
帮助:(外链图)

演示:

摘要:
==============================================
命令行彩显PING工具,兼容PING的基础语法,并做适当扩展。

增加两个数学描述:
PINGQUA 为PING的品率,值域(0, 1.0],表示PING的品质等级,1.0为最高品质。
STD 为PING的回环时间标准差,表示回环时间的波动幅度,在100以内可算较佳。
==============================================

用法:
-------------------------------------------------------------------------
ping2 [host|IP] -t -f -a -n[count] -i[TTL] -v[TOS] -w[time out] -l[size] -d[delay]
-------------------------------------------------------------------------
  -t  Ping the specifed host until interrupted
  -f  Don't fragment
  -a  As IP address
  -n  Send count
  -i  Time to live
  -v  Type of service
  -w  Timeout (in milliseconds)
  -l  Send buffer size
  -d  Delayed time
  -h  Show help information
-------------------------------------------------------------------------

举例:
-------------------------------------------------------------------------
ping2 www.baidu.com
ping2 -n 3 www.baidu.com
ping2 www.baidu.com -n3
ping2 -n3 -l128 www.baidu.com
ping2 -i55 -fan 55 www.baidu.com -d300 -w64
ping2 -n3 -d300 -w64 www.baidu.com
...
-------------------------------------------------------------------------

备注:(关于ERRORNUM对应的状态描述)
-------------------------------------------------------------------------
IP_BUF_TOO_SMALL            11001    答复缓冲区太小
IP_DEST_NET_UNREACHABLE     11002    目标网络不可达
IP_DEST_HOST_UNREACHABLE    11003    目标主机不可达
IP_DEST_PROT_UNREACHABLE    11004    目的地的协议是遥不可及
IP_DEST_PORT_UNREACHABLE    11005    目标端口不可达
IP_NO_RESOURCES             11006    IP资源不足是可用的
IP_BAD_OPTION               11007    指定了错误的IP选项
IP_HW_ERROR                 11008    一个硬件错误
IP_PACKET_TOO_BIG           11009    包太大
IP_REQ_TIMED_OUT            11010    请求超时
IP_BAD_REQ                  11011    一个坏的请求
IP_BAD_ROUTE                11012    一个糟糕的路线
IP_TTL_EXPIRED_TRANSIT      11013    在传输过程中的生存时间(TTL)的过期
IP_TTL_EXPIRED_REASSEM      11014    在碎片重组过程中的生存时间过期
IP_PARAM_PROBLEM            11015    一个参数的问题
IP_SOURCE_QUENCH            11016    数据包到达太快,处理数据包可能被丢弃
IP_OPTION_TOO_BIG           11017    一个IP选项是太大了
IP_BAD_DESTINATION          11018    一个坏的目的地
IP_GENERAL_FAILURE          11050    一般故障,返回一些畸形的ICMP数据包
-------------------------------------------------------------------------

版本:
VERSION 1.0


编译:

  1. REM        UNICODE COMPILATION:
  2.         G++ ping2.c -lWs2_32 -lIphlpapi -lUser32 -D _UNICODE -D UNICODE -municode -O2 -static
  3.         CL  ping2.c /O2 /Oy- /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /MD

  4. REM        ANSI COMPILATION:
  5.         G++ ping2.c -lWs2_32 -lIphlpapi -lUser32 -O2 -static
  6.         CL  ping2.c /O2 /Oy- /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /MD
复制代码
源码:

  1. /*
  2.         CONSOLE PING TOOL, COPYRIGHT@2017~2019 BY LEO, VERSION 1.0
  3.         PING2.EXE
  4.         LINK WS2_32 IPHLPAPI USER32
  5. */

  6. #include <stdio.h>
  7. #include <winsock.h>
  8. #include <iphlpapi.h>
  9. #include <icmpapi.h>
  10. #include <tchar.h>
  11. #include <ctype.h>
  12. #include <math.h>

  13. #if defined _MSC_VER
  14. #pragma comment(lib,"Ws2_32.lib")
  15. #pragma comment(lib,"Iphlpapi.lib")
  16. #pragma comment(lib,"User32.lib")
  17. #endif

  18. #if defined(_UNICODE) || defined(UNICODE)
  19. #define TCHARFORMAT WCHAR
  20. #else
  21. #define TCHARFORMAT CHAR
  22. #endif

  23. #define DEFAULT_SEND_SIZE           32
  24. #define DEFAULT_COUNT               4
  25. #define DEFAULT_TTL                 55
  26. #define DEFAULT_TOS                 0
  27. #define DEFAULT_TIMEOUT             1000
  28. #define DEFAULT_TIMEDELAY           1000

  29. //定义帮助说明
  30. #define HELP_INFORMATION _T("\
  31. ping2 v1.0 - Console Colour Ping Tool - Copyright (C) 2017-2019 by Leo\n\
  32. Usage: ping2 [host|IP] -t -f -a -n[count] -i[TTL] -v[TOS] -w[time out] -l[size] -d[delay]\n\
  33. \n\
  34. General options:\n\
  35.   -t  Ping the specifed host until interrupted\n\
  36.   -f  Don't fragment\n\
  37.   -a  As IP address\n\
  38.   -n  Send count\n\
  39.   -i  Time to live\n\
  40.   -v  Type of service\n\
  41.   -w  Timeout (in milliseconds)\n\
  42.   -l  Send buffer size\n\
  43.   -d  Delayed time\n\
  44.   -h  Show help information\n\
  45. \n\
  46. Official website:\n\
  47.       http://www.bathome.net/thread-44179-1-1.html\n")

  48. #define STR_HEAD _T("\
  49. ==============WELCOME YOU TO USE THE COLOR PING TOOL=============")

  50. #define STR_LINE _T("\
  51. =================================================================")

  52. //开关解析宏名
  53. #define _OPT_TEOF -1
  54. #define _OPT_TILL -2
  55. #define _OPT_TERR -3

  56. //开关解析变量
  57. INT OPTIND=1, OPTOPT, UNOPTIND=-1;
  58. TCHAR* OPTARG;

  59. //开关解析模块
  60. INT _tgetopt(INT nargc, TCHAR* nargv[], TCHAR* ostr)
  61. {
  62.         static TCHAR* place = (TCHAR*)_T("");
  63.         static TCHAR* lastostr = NULL;
  64.         register TCHAR* oli;

  65.         if(ostr!=lastostr)
  66.         {
  67.                 lastostr=ostr;
  68.                 place=(TCHAR*)_T("");
  69.         }

  70.         if(!*place)
  71.         {
  72.                 if(
  73.                     (OPTIND>=nargc)                           ||
  74.                     (*(place=nargv[OPTIND]) !=(TCHAR)_T('-')) ||
  75.                     (!*(++place))
  76.                 )
  77.                 {
  78.                         if(*place !=(TCHAR)_T('-') && OPTIND <nargc)
  79.                         {
  80.                                 place =(TCHAR*)_T("");
  81.                                 if(UNOPTIND == -1)
  82.                                 {
  83.                                         UNOPTIND = OPTIND++;
  84.                                         return _OPT_TILL;
  85.                                 }
  86.                                 else
  87.                                 {
  88.                                         return _OPT_TERR;
  89.                                 }
  90.                         }

  91.                         place=(TCHAR*)_T("");
  92.                         return _OPT_TEOF;
  93.                 }
  94.                 if (*place == (TCHAR)_T('-') && *(place+1) == (TCHAR)_T('\0'))
  95.                 {
  96.                         ++OPTIND;
  97.                         return _OPT_TEOF;
  98.                 }
  99.         }

  100.         if (
  101.             (OPTOPT=*place++) == (TCHAR)_T(':') ||
  102.             !(oli=(TCHAR*)_tcschr((TCHARFORMAT*)ostr, (TCHAR)OPTOPT))
  103.         )
  104.         {
  105.                 if(!*place)
  106.                 {
  107.                         ++OPTIND;
  108.                 }
  109.         }

  110.         if (oli != NULL && *(++oli) !=(TCHAR)_T(':'))
  111.         {
  112.                 OPTARG=NULL;
  113.                 if(!*place)
  114.                 {
  115.                         ++OPTIND;
  116.                 }
  117.         }
  118.         else
  119.         {
  120.                 if(*place)
  121.                 {
  122.                         OPTARG=place;
  123.                 }
  124.                 else if(nargc <= ++OPTIND)
  125.                 {
  126.                         place=(TCHAR*)_T("");
  127.                 }
  128.                 else
  129.                 {
  130.                         OPTARG=nargv[OPTIND];
  131.                 }
  132.                 place=(TCHAR*)_T("");
  133.                 ++OPTIND;
  134.         }
  135.         return OPTOPT;
  136. }

  137. //彩显函数
  138. INT ColorTcs(HANDLE handle_out, TCHAR* tcsTEXT1, TCHAR* tcsTEXT2, INT tcsCOLOR1, INT tcsCOLOR2)
  139. {
  140.         SetConsoleTextAttribute(handle_out, tcsCOLOR1);  //项色
  141.         _ftprintf(stdout, _T("%s"), tcsTEXT1);
  142.         SetConsoleTextAttribute(handle_out, tcsCOLOR2);  //文色
  143.         _ftprintf(stdout, _T("%s\n"), tcsTEXT2);
  144.         return 0;
  145. }

  146. //转 TCHAR* 函数
  147. TCHAR* toTCHAR(VOID* csDATA, BOOL wcsMODE)
  148. {
  149. #if defined(_UNICODE) || defined(UNICODE)

  150.         if(wcsMODE == TRUE)
  151.         {
  152.                 return (TCHAR*)csDATA;
  153.         }
  154.         else
  155.         {
  156.                 INT wLEN = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (CHAR*)csDATA, -1, NULL, 0);
  157.                 WCHAR* wsDATA = new WCHAR[wLEN + 1];
  158.                 MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (CHAR*)csDATA, -1, wsDATA, wLEN);
  159.                 wsDATA[wLEN]=L'\0';
  160.                 return (TCHAR*)wsDATA;
  161.         }

  162. #else

  163.         if(wcsMODE == TRUE)
  164.         {
  165.                 INT aLEN = WideCharToMultiByte(CP_ACP, NULL, (WCHAR*)csDATA, -1, NULL, 0, NULL, NULL);
  166.                 CHAR* asDATA = new CHAR[aLEN + 1];
  167.                 WideCharToMultiByte(CP_ACP, NULL, (WCHAR*)csDATA, -1, asDATA, aLEN, NULL, NULL);
  168.                 asDATA[aLEN] = '\0';
  169.                 return (TCHAR*)asDATA;
  170.         }
  171.         else
  172.         {
  173.                 return (TCHAR*)csDATA;
  174.         }

  175. #endif
  176. }

  177. //PING核心函数
  178. INT SendPingByUIP(HANDLE handle_out, ULONG uIPADRR, BYTE opeFLAG, INT opeCOUNT, INT opeTTL, INT opeTOS, INT opeTIMEOUT, INT opeSENDSIZE, INT opeTIMEDELAY)
  179. {
  180.         HANDLE hicmpFILE = IcmpCreateFile();
  181.         if (hicmpFILE == INVALID_HANDLE_VALUE)
  182.         {
  183.                 //创建包文失败
  184.                 _ftprintf(stderr, _T("The ICMP header creats failed\n"));
  185.                 exit(1);
  186.         }

  187.         //填充包文头
  188.         LPVOID sendDATA  = (LPVOID)(new BYTE[opeSENDSIZE]);
  189.         memset(sendDATA, 'E', opeSENDSIZE);

  190.         DWORD  replySIZE = sizeof(ICMP_ECHO_REPLY) + opeSENDSIZE;
  191.         LPVOID replyBUFF = (LPVOID)(new BYTE[replySIZE]);

  192.         //设置 IP_OPTION_INFORMATION 参数
  193.         PIP_OPTION_INFORMATION sendOPTS = new IP_OPTION_INFORMATION;
  194.         sendOPTS->OptionsData = 0;
  195.         sendOPTS->OptionsSize = 0;
  196.         sendOPTS->Ttl         = opeTTL;
  197.         sendOPTS->Tos         = opeTOS;
  198.         sendOPTS->Flags       = (opeFLAG|0x02) ?IP_FLAG_DF :0;

  199.         //创建一个地址容器
  200.         PIN_ADDR replyADDR = new IN_ADDR;

  201. #if defined(_UNICODE) || defined(UNICODE)

  202.         WCHAR* replyADDRW=new WCHAR[_MAX_PATH];

  203. #endif

  204.         INT succeedICMP=0, failedICMP=0, minRTT=-1, maxRTT=0;
  205.         DOUBLE totalRTT=0.0f, totalSquareRTT=0.0f;

  206.         if(opeFLAG & 0x01){opeCOUNT = 65535;}

  207.         for(INT i=0; i<opeCOUNT; i++)
  208.         {
  209.                 //发送包文
  210.                 if(IcmpSendEcho(hicmpFILE, uIPADRR, sendDATA, opeSENDSIZE, sendOPTS, replyBUFF, replySIZE, opeTIMEOUT) !=0)
  211.                 {
  212.                         PICMP_ECHO_REPLY pechoREPLY =(PICMP_ECHO_REPLY)replyBUFF;
  213.                         if(pechoREPLY->Status == IP_SUCCESS)
  214.                         {
  215.                                 replyADDR->S_un.S_addr = pechoREPLY->Address;
  216.                                 CHAR* replyADDRA=inet_ntoa(*replyADDR);

  217. #if defined(_UNICODE) || defined(UNICODE)

  218.                                 INT rLEN=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, replyADDRA, -1, NULL, 0);
  219.                                 MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, replyADDRA, -1, replyADDRW, rLEN);
  220.                                 replyADDRW[rLEN]='\0';
  221.                                 _ftprintf(stdout, _T("      REPLY FROM %s: BYTES=%u, TIME=%2ldms, TTL=%u\n"), (TCHARFORMAT*)replyADDRW, pechoREPLY->DataSize, pechoREPLY->RoundTripTime, pechoREPLY->Options.Ttl);

  222. #else

  223.                                 _ftprintf(stdout, _T("      REPLY FROM %s: BYTES=%u, TIME=%2ldms, TTL=%u\n"), (TCHARFORMAT*)replyADDRA, pechoREPLY->DataSize, pechoREPLY->RoundTripTime, pechoREPLY->Options.Ttl);

  224. #endif

  225.                                 //每PING间隔
  226.                                 if(i+1 < opeCOUNT)
  227.                                 {
  228.                                         Sleep(opeTIMEDELAY);
  229.                                 }

  230.                                 //发包计数器
  231.                                 succeedICMP ++;

  232.                                 //包统计模块
  233.                                 totalRTT += (DOUBLE)pechoREPLY->RoundTripTime;
  234.                                 totalSquareRTT += pow((DOUBLE)pechoREPLY->RoundTripTime, 2);
  235.                                 if(minRTT==-1)
  236.                                 {
  237.                                         minRTT =(INT)pechoREPLY->RoundTripTime;
  238.                                 }
  239.                                 if(minRTT > (INT)pechoREPLY->RoundTripTime)
  240.                                 {
  241.                                         minRTT =(INT)pechoREPLY->RoundTripTime;
  242.                                 }
  243.                                 if(maxRTT < (INT)pechoREPLY->RoundTripTime)
  244.                                 {
  245.                                         maxRTT =(INT)pechoREPLY->RoundTripTime;
  246.                                 }

  247.                         }
  248.                         else
  249.                         {
  250.                                 //丢包计数器
  251.                                 failedICMP ++;

  252.                                 SetConsoleTextAttribute(handle_out, 4|8);
  253.                                 _ftprintf(stdout, _T("ERROR NUM: %u\n"), pechoREPLY->Status);
  254.                                 SetConsoleTextAttribute(handle_out, 2|8);
  255.                         }
  256.                 }
  257.                 else
  258.                 {
  259.                         failedICMP ++;
  260.                         SetConsoleTextAttribute(handle_out, 4|8);
  261.                         _ftprintf(stderr, _T("THE ICMP MESSAGE SENDS FAILED\n"));
  262.                         break;
  263.                 }
  264.         }

  265.         //计算回环方差
  266.         DOUBLE avageTIME=totalRTT/succeedICMP, sdevTIME=sqrt(totalSquareRTT/succeedICMP-pow((DOUBLE)(totalRTT/succeedICMP), 2)), pingQUA=(avageTIME==0.0f)?1:(1.0f-sdevTIME/avageTIME);

  267.         //设置显示颜色
  268.         SetConsoleTextAttribute(handle_out, 1|2|8);

  269.         //统计PING质率
  270.         _ftprintf(stdout, _T("PINGQUA : %-1.1lf\n"), pingQUA);

  271.         //统计包达成率
  272.         _ftprintf(stdout, _T("PACKETS : SEND=%d, RECEIVED=%d, LOST=%d (%2.0lf%% LOSS)\n"), succeedICMP+failedICMP, succeedICMP, failedICMP, (DOUBLE)failedICMP*100.0f/(succeedICMP+failedICMP));

  273.         //显示统计信息
  274.         _ftprintf(stdout, _T("TRIPTIME: MIN(TIME)=%dms, MAX(TIME)=%dms, E(TIME)=%dms, SDT=%.2lfms\n"), minRTT, maxRTT, (INT)avageTIME, sdevTIME);

  275.         //释放句柄
  276.         CloseHandle(hicmpFILE);

  277.         //释放资源
  278.         operator delete (sendDATA);
  279.         operator delete (replyBUFF);
  280.         delete sendOPTS;
  281.         delete replyADDR;

  282. #if defined(_UNICODE) || defined(UNICODE)

  283.         delete replyADDRW;

  284. #endif

  285.         return 0;
  286. }

  287. #if defined _MSC_VER
  288. #else
  289. extern "C"
  290. #endif

  291. //MAIN主函数
  292. INT _tmain(INT argc, TCHAR** argv)
  293. {
  294.         if(argc<2)
  295.         {
  296.                 //无参数则退出
  297.                 _ftprintf(stdout, HELP_INFORMATION);
  298.                 exit(0);
  299.         }

  300.         //启动安全套接字
  301.         WSADATA  Ws;
  302.         if(WSAStartup(MAKEWORD(2, 2), &Ws) !=0)
  303.         {
  304.                 _ftprintf(stderr, _T("Starting the winsocket failed\n"));
  305.                 return 1;
  306.         }

  307.         //设置传入参数
  308.         TCHAR* opeTHOST=NULL;
  309.         BYTE opeFLAG=0x00;
  310.         INT K=_OPT_TEOF, opeCOUNT=DEFAULT_COUNT, opeTTL=DEFAULT_TTL, opeTOS=DEFAULT_TOS, opeTIMEOUT=DEFAULT_TIMEOUT, opeSENDSIZE=DEFAULT_SEND_SIZE, opeTIMEDELAY=DEFAULT_TIMEDELAY;

  311.         //开关解析
  312.         while((K=_tgetopt(argc, argv, (TCHAR*)_T("htfan:i:v:w:l:d:HTFAN:I:V:W:L:D:"))) != _OPT_TEOF)
  313.         {
  314.                 switch(K)
  315.                 {
  316.                 case 't':
  317.                 case 'T':
  318.                         opeFLAG |= 0x01;
  319.                         break;

  320.                 case 'f':
  321.                 case 'F':
  322.                         opeFLAG |= 0x02;
  323.                         break;

  324.                 case 'a':
  325.                 case 'A':
  326.                         ;
  327.                         opeFLAG |= 0x04;
  328.                         break;

  329.                 case 'n':
  330.                 case 'N':
  331.                         if(OPTARG !=NULL && _istdigit(*OPTARG) !=0)
  332.                         {
  333.                                 opeCOUNT =_ttoi((TCHARFORMAT*)OPTARG);
  334.                                 if(opeCOUNT > 0)
  335.                                 {
  336.                                         opeFLAG |= 0x08;
  337.                                         break;
  338.                                 }
  339.                         }
  340.                         _ftprintf(stderr, _T("The switch '-n' needs a positive number\n"));
  341.                         exit(1);

  342.                 case 'i':
  343.                 case 'I':
  344.                         if(OPTARG !=NULL && _istdigit(*OPTARG) !=0)
  345.                         {
  346.                                 opeTTL =_ttoi((TCHARFORMAT*)OPTARG);
  347.                                 if(opeTTL >= 0)
  348.                                 {

  349.                                         opeFLAG |= 0x0F;
  350.                                         break;
  351.                                 }
  352.                         }
  353.                         _ftprintf(stderr, _T("The switch '-i' needs a positive number\n"));
  354.                         exit(1);

  355.                 case 'v':
  356.                 case 'V':
  357.                         if(OPTARG !=NULL && _istdigit(*OPTARG) !=0)
  358.                         {
  359.                                 opeTOS =_ttoi((TCHARFORMAT*)OPTARG);
  360.                                 if(opeTOS >= 0)
  361.                                 {
  362.                                         opeFLAG |= 0x10;
  363.                                         break;
  364.                                 }
  365.                         }
  366.                         _ftprintf(stderr, _T("The switch '-v' needs a positive number\n"));
  367.                         exit(1);

  368.                 case 'w':
  369.                 case 'W':
  370.                         if(OPTARG !=NULL && _istdigit(*OPTARG) !=0)
  371.                         {
  372.                                 opeTIMEOUT =_ttoi((TCHARFORMAT*)OPTARG);
  373.                                 if(opeTIMEOUT >= 0)
  374.                                 {
  375.                                         opeFLAG |= 0x20;
  376.                                         break;
  377.                                 }
  378.                         }
  379.                         _ftprintf(stderr, _T("The switch '-w' needs a positive number\n"));
  380.                         exit(1);

  381.                 case 'l':
  382.                 case 'L':
  383.                         if(OPTARG !=NULL && _istdigit(*OPTARG) !=0)
  384.                         {
  385.                                 opeSENDSIZE =_ttoi((TCHARFORMAT*)OPTARG);
  386.                                 if(0<= opeSENDSIZE && opeSENDSIZE <=65500)
  387.                                 {
  388.                                         opeFLAG |= 0x40;
  389.                                         break;
  390.                                 }
  391.                         }
  392.                         _ftprintf(stderr, _T("The switch '-l' needs a number less 65KB\n"));
  393.                         exit(1);

  394.                 case 'd':
  395.                 case 'D':
  396.                         if(OPTARG !=NULL && _istdigit(*OPTARG) !=0)
  397.                         {
  398.                                 opeTIMEDELAY =_ttoi((TCHARFORMAT*)OPTARG);
  399.                                 if(opeTIMEDELAY >= 0)
  400.                                 {
  401.                                         opeFLAG |= 0x80;
  402.                                         break;
  403.                                 }
  404.                         }
  405.                         _ftprintf(stderr, _T("The switch '-d' needs a positive number\n"));
  406.                         exit(1);

  407.                 case 'h':
  408.                 case 'H':
  409.                         _ftprintf(stdout, HELP_INFORMATION);
  410.                         exit(0);

  411.                 case _OPT_TILL:
  412.                         //第一个无选项的参数识别为主机名
  413.                         opeTHOST = argv[UNOPTIND];
  414.                         break;

  415.                 case _OPT_TERR:
  416.                         _ftprintf(stderr, _T("Extra parameters "%s"\n"), argv[OPTIND]);
  417.                         exit(1);

  418.                 default:
  419.                         _ftprintf(stderr, _T("Unknown switch '-%c'\n"), K);
  420.                         exit(1);

  421.                 }
  422.         }

  423.         //无主机名,强制退出
  424.         if(opeTHOST == NULL)
  425.         {
  426.                 _ftprintf(stderr, _T("Needs host name or IP address\n"));
  427.                 exit(1);
  428.         }

  429. #if defined(_UNICODE) || defined(UNICODE)

  430.         INT thostLEN = WideCharToMultiByte(CP_ACP, NULL, opeTHOST, -1, NULL, 0, NULL, NULL);
  431.         CHAR* opeHOSTNAME = new CHAR[thostLEN + 1];
  432.         WideCharToMultiByte(CP_ACP, NULL, opeTHOST, -1, opeHOSTNAME, thostLEN, NULL, NULL);
  433.         opeHOSTNAME[thostLEN] = '\0';

  434. #else

  435.         CHAR* opeHOSTNAME = opeTHOST;

  436. #endif

  437.         //获取主机HOST
  438.         PHOSTENT pHOSTENT = gethostbyname(opeHOSTNAME);
  439.         ULONG uIPADRR = INADDR_NONE;

  440.         //尝试作为IP地址解析
  441.         if (! pHOSTENT)
  442.         {
  443.                 uIPADRR = inet_addr(opeHOSTNAME);
  444.                 //识别失败,非正常主机名
  445.                 if (uIPADRR == INADDR_NONE)
  446.                 {
  447.                         _ftprintf(stderr, _T("Not a correct hostname\n"), K);
  448.                         exit(1);
  449.                 }
  450.         }

  451.         //获取UIP值
  452.         PIN_ADDR pINADRR = (PIN_ADDR)pHOSTENT->h_addr;
  453.         if((uIPADRR=pINADRR->S_un.S_addr) == INADDR_NONE)
  454.         {
  455.                 //获取UIP失败,执行退出
  456.                 _ftprintf(stderr, _T("Get UIP failed\n"), K);
  457.                 exit(1);
  458.         }

  459.         //获取控制台输出句柄
  460.         HANDLE handle_out=GetStdHandle(STD_OUTPUT_HANDLE);

  461.         //获取控制台初始配色
  462.         WORD orgCOLOR;
  463.         CONSOLE_SCREEN_BUFFER_INFO buffINFO;
  464.         GetConsoleScreenBufferInfo(handle_out, &buffINFO);
  465.         orgCOLOR=buffINFO.wAttributes;

  466.         //显示题头
  467.         ColorTcs(handle_out, (TCHARFORMAT*)STR_HEAD, (TCHARFORMAT*)_T(""), 4|8, 2|4|8);
  468.         //显示主机名
  469.         ColorTcs(handle_out, (TCHARFORMAT*)_T("<HOST-NAME> "), _tcsupr(toTCHAR(pHOSTENT->h_name, FALSE)), 4|8, 1|2|8);

  470.         //显示主机别名
  471.         INT iINDEX = 0;
  472.         while(pHOSTENT->h_aliases[iINDEX])
  473.         {
  474.                 ColorTcs(handle_out, (TCHARFORMAT*)_T("<ALIA-NAME> "), _tcsupr(toTCHAR(pHOSTENT->h_aliases[iINDEX], FALSE)), 4|8, 1|2|8);
  475.                 iINDEX ++;
  476.         }
  477.         //显示题尾
  478.         ColorTcs(handle_out, (TCHARFORMAT*)STR_LINE, (TCHARFORMAT*)_T(""), 4|8, 2|8);

  479.         //调用 PING 核心函数
  480.         INT retVALUE = SendPingByUIP(handle_out, uIPADRR, opeFLAG, opeCOUNT, opeTTL, opeTOS, opeTIMEOUT, opeSENDSIZE, opeTIMEDELAY);

  481. #if defined(_UNICODE) || defined(UNICODE)

  482.         //释放内存
  483.         delete opeHOSTNAME;

  484. #endif

  485.         //还原字体颜色
  486.         SetConsoleTextAttribute(handle_out, orgCOLOR);

  487.         //关闭安全套接字
  488.         WSACleanup();

  489.         return retVALUE;
  490. }
复制代码

评分

参与人数 4技术 +4 收起 理由
yu2n + 1 感谢分享
freesoft00 + 1 +1
ivor + 1 感谢分享
老刘1号 + 1 感谢分享

查看全部评分

发表于 2017-5-21 18:24:26 | 显示全部楼层
本帖最后由 老刘1号 于 2017-10-14 12:07 编辑

感谢楼主分享,希望推出更多强力第三方工具!
 楼主| 发表于 2017-5-21 18:26:37 | 显示全部楼层
本帖最后由 happy886rr 于 2017-5-21 18:36 编辑

回复 2# 老刘1号
不建议下载附件的版本,那是DLL依赖版8KB。请自行编译吧,用我上次的精简版VC++2010,直接拖拽就行。把/MD改成/MT,这样xp系统也能使用。
发表于 2017-5-21 20:05:22 | 显示全部楼层
回复 3# happy886rr


    如果能加入 pingIP地址范围就更好,Linux就有ping范围地址。要求返回速度要快
 楼主| 发表于 2017-5-21 20:25:12 | 显示全部楼层
本帖最后由 happy886rr 于 2017-5-21 20:29 编辑

回复 4# ivor
用批处理可以解决批量ping,linux的sh就是那样ping的。返回速度要快?这个太快了就会失败,需要有个时间去接受包文。弄成多线程,存在上锁的问题,不太安全。高速ping不是太可靠。
发表于 2017-5-21 20:34:43 | 显示全部楼层
本帖最后由 freesoft00 于 2017-5-21 20:59 编辑
命令行彩显PING工具

彩显的不错,不知道微软为什么命令行也不带个颜色。

可以直接拖拽c或cpp后缀的文件直接编译。

ping2.c直接拖到vc.cmd不行呀。
 楼主| 发表于 2017-5-21 21:10:44 | 显示全部楼层
回复 6# freesoft00
不是ping2.c,是ping2.cpp
这个是C++,后缀只能是.cpp才能编译,你改成cpp后缀,真的是一键编译,因为那个VC++2010在pe里都能运行,兼容性好得不得了。
发表于 2017-5-21 21:31:15 | 显示全部楼层
回复 7# happy886rr


    完全ok
发表于 2017-5-21 21:40:08 | 显示全部楼层
<HOST-NAME> WWW.BAIDU.COM
显示的网址都是大写。
这个我不懂啊,好像原来看电脑教程的时候网址大小写是有区别的。但是我用大写也能访问,但是被浏览器在地址栏里面自动改成小写了。
那么这里的HOST-NAME改成小写或者改成网址本身的大小写是不是更好。
 楼主| 发表于 2017-5-21 22:43:23 | 显示全部楼层
回复 9# freesoft00
主机名大小写无碍,你自己在源码上改吧,把_tcsupr()去掉就行。编译还是那么简单,直接拖拽就出来exe了,第三方的制造就是这么简单

评分

参与人数 1技术 +1 收起 理由
freesoft00 + 1 +1

查看全部评分

发表于 2017-5-22 07:04:04 | 显示全部楼层
可以考虑加上保持输出丢包率,这样就不用等结束的时候才能看得到丢包率了。
类似这样:

  1. 字节=32 时间=21ms TTL=54 数据包: 已发送 = 708455,已接收 = 686073,丢失 = 22382 (3% 丢失)
复制代码
 楼主| 发表于 2017-5-22 08:04:18 | 显示全部楼层
本帖最后由 happy886rr 于 2017-5-23 15:51 编辑

回复 11# codegay
可在顶楼源码中替换第259行 为:
  1. _ftprintf(stdout, _T("来自%s:字节=%u 时间=%2ldms TTL=%u 数据包: 已发送 =%d,已接收 =%d,丢失 =%d (%2.0lf%% 丢失)\n"), (TCHARFORMAT*)replyADDRA, pechoREPLY->DataSize, pechoREPLY->RoundTripTime, pechoREPLY->Options.Ttl, (succeedICMP+failedICMP+1)*opeSENDSIZE, (succeedICMP+1)*pechoREPLY->DataSize, failedICMP*pechoREPLY->DataSize, 100.0f*failedICMP/(succeedICMP+failedICMP+1));
复制代码
然后使用我精简的VC编译器http://www.bathome.net/thread-44180-1-1.html,直接拖拽cpp文件,就出来exe了。
发表于 2017-5-22 09:12:52 | 显示全部楼层
ping -t 能在每行reply前面加个时间戳吗?
发表于 2017-5-23 14:26:13 | 显示全部楼层
-t参数和系统内的有点不同。
  1. D:\VC2010>ping2.exe www.baidu.com -t
  2. ==============WELCOME YOU TO USE THE COLOR PING TOOL=============
  3. <HOST-NAME> WWW.BAIDU.COM
  4. =================================================================
  5.       REPLY FROM 61.135.169.121: BYTES=32, TIME=68ms, TTL=128
  6.       REPLY FROM 61.135.169.121: BYTES=32, TIME=59ms, TTL=128
  7.       REPLY FROM 61.135.169.121: BYTES=32, TIME=74ms, TTL=128
  8.       REPLY FROM 61.135.169.121: BYTES=32, TIME=35ms, TTL=128
  9.       REPLY FROM 61.135.169.121: BYTES=32, TIME=50ms, TTL=128
  10.       REPLY FROM 61.135.169.121: BYTES=32, TIME=55ms, TTL=128
  11. THE ICMP MESSAGE SENDS FAILED
  12. PINGQUA : 0.8
  13. PACKETS : SEND=7, RECEIVED=6, LOST=1 (14% LOSS)
  14. TRIPTIME: MIN(TIME)=35ms, MAX(TIME)=74ms, E(TIME)=56ms, SDT=12.59ms
复制代码
我这里无线网不是太顺畅,有断流的现象,只要一断,ping就中止了,而系统的只是提示超时还会继续ping
  1. ping www.baidu.com -t

  2. 正在 Ping www.baidu.com [61.135.169.125] 具有 32 字节的数据:
  3. 请求超时。
  4. 请求超时。
  5. 来自 61.135.169.125 的回复: 字节=32 时间=17ms TTL=128
  6. 来自 61.135.169.125 的回复: 字节=32 时间=44ms TTL=128
  7. 来自 61.135.169.125 的回复: 字节=32 时间=43ms TTL=128
复制代码
 楼主| 发表于 2017-5-23 15:51:02 | 显示全部楼层
回复 14# freesoft00
断网了,就没有ping的必要了,所以直接中断就行。我都是按正常逻辑设置的。因为ping一个断网没必要。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 00:29 , Processed in 0.026786 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表