当前位置:首页 > 代码 > 正文

ping命令源代码(ping命令原理详解)

admin 发布:2022-12-19 20:02 150


本篇文章给大家谈谈ping命令源代码,以及ping命令原理详解对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

ping 命令详解

1、首先打开cmd直接输入ping命令回车,就可以看到系统给出的最详细的说明了:

2、ping最常用的就是ping加域名了,方法就是ping加一个空格,后面跟域名即可:

3、回车以后显示时间有秒数说明是能ping通的:

4、另外还可以在pingip地址,就是直接在ping后面加ip地址就行:

5、接着可以在ping后面加参数即可,比如下面加了个t参数就可以一直ping:

6、如果在使用ping的过程中,想停止ping,直接按ctrl+C快捷键打断即可。以上就是ping命令的详细用法:

代码编程——ping命令流程(图)

不是我写的,找的。

#include stdio.h

#include string.h

#include stdlib.h

#include time.h

#define WIN32_LEAN_AND_MEAN

#include winsock.h

#pragma comment(lib, "Wsock32.lib")

#define ICMP_ECHO 8

#define ICMP_ECHOREPLY 0

//#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)

#define ICMP_MIN (8 + 4) // minimum 8 byte icmp packet (just header + timestamp)

// IP header

typedef struct _tagX_iphdr

{

unsigned char h_len:4; // length of the header

unsigned char version:4; // Version of IP

unsigned char tos; // Type of service

unsigned short total_len; // total length of the packet

unsigned short ident; // unique identifier

unsigned short frag_and_flags; // flags

unsigned char ttl; // ttl

unsigned char proto; // protocol (TCP, UDP etc)

unsigned short checksum; // IP checksum

unsigned int sourceIP;

unsigned int destIP;

}XIpHeader;

// ICMP header

typedef struct _tagX_icmphdr

{

unsigned char i_type;

unsigned char i_code;

unsigned short i_cksum;

unsigned short i_id;

unsigned short i_seq;

unsigned long i_timestamp;

}XIcmpHeader;

//puclic code

//网际校验和生产算法

//网际校验和是被校验数据16位值的反码和(ones-complement sum)

unsigned short in_cksum(unsigned short* addr, int len)

{

int nleft = len;

int sum = 0;

unsigned short* w = addr;

unsigned short answer = 0;

while(nleft 1) {

sum += *w++;

nleft -= 2;

}

if(nleft == 1) {

*(unsigned char*)(answer) = *(unsigned char*)w;

sum += answer;

}

sum = (sum 16) + (sum 0xffff);

sum += (sum 16);

answer = ~sum;

return (answer);

}

void fill_IcmpData(char *buf, int datasize)

{

if (buf)

{

char ch = 0;

char* icmpdata = buf + sizeof(XIcmpHeader);

fprintf(stdout, "(IcmpData)\r\n");

for (int i = 0; i datasize; i++)

{

ch = 'A' + i%('z' - 'A');

*(icmpdata + i) = ch;

fprintf(stdout, "%c", ch);

}

fprintf(stdout, "\r\n");

}

}

void fill_IcmpHeader(char *buf, int datasize)

{

static unsigned short seq_no = 0;

XIcmpHeader *icmp_hdr = (XIcmpHeader *)buf;

if (icmp_hdr)

{

icmp_hdr-i_type = ICMP_ECHO;

icmp_hdr-i_code = 0;

icmp_hdr-i_cksum = 0;

icmp_hdr-i_id = (unsigned short)GetCurrentProcessId();

icmp_hdr-i_seq = seq_no++;

icmp_hdr-i_timestamp = (unsigned long)::GetTickCount();

icmp_hdr-i_cksum = in_cksum((unsigned short*)buf, sizeof(XIcmpHeader) + datasize);

fprintf(stdout, "(IcmpHeader)\r\n");

fprintf(stdout, "%02X%02X%04X\r\n", icmp_hdr-i_type, icmp_hdr-i_code, icmp_hdr-i_cksum);

fprintf(stdout, "%04X%04X\r\n", icmp_hdr-i_id, icmp_hdr-i_seq);

fprintf(stdout, "%08X\r\n", icmp_hdr-i_timestamp);

}

}

// decode

void decode_IpIcmp(char *buf, int size)

{

XIpHeader *ip_hdr = (XIpHeader *)buf;

unsigned short iphdrlen;

if (ip_hdr)

{

fprintf(stdout, "(IpHeader)\r\n");

fprintf(stdout, "%01X%01X%02X%04X\r\n", ip_hdr-version, ip_hdr-h_len, ip_hdr-tos, ip_hdr-total_len);

fprintf(stdout, "%04X%04X\r\n", ip_hdr-ident, ip_hdr-frag_and_flags);

fprintf(stdout, "%02X%02X%04X\r\n", ip_hdr-ttl, ip_hdr-proto, ip_hdr-checksum);

//iphdrlen = ip_hdr-h_len * 4; // number of 32-bit words *4 = bytes

iphdrlen = ip_hdr-h_len 2; // number of 32-bit words *4 = bytes

fprintf(stdout, "(IcmpHeader)\r\n");

if (size iphdrlen + ICMP_MIN)

{

fprintf(stdout, "Reply %d bytes Too few\r\n", size);

}

else

{

XIcmpHeader *icmp_hdr = (XIcmpHeader *)(buf + iphdrlen);

fprintf(stdout, "%02X%02X%04X\r\n", icmp_hdr-i_type, icmp_hdr-i_code, icmp_hdr-i_cksum);

fprintf(stdout, "%04X%04X\r\n", icmp_hdr-i_id, icmp_hdr-i_seq);

fprintf(stdout, "%08X\r\n", icmp_hdr-i_timestamp);

unsigned long timestamp = 0;

timestamp = (unsigned long)::GetTickCount();

timestamp -= icmp_hdr-i_timestamp;

struct sockaddr_in from;

from.sin_addr.s_addr = ip_hdr-sourceIP;

fprintf(stdout, "Reply %d bytes from: %s time%d TTL=%d icmp_seq=%d\r\n",

size,

inet_ntoa(from.sin_addr),

timestamp,

ip_hdr-ttl,

icmp_hdr-i_seq

);

}

}

}

int main(int argc, char **argv)

{

int ret = 0;

WSADATA ws;

WSAStartup(0x0101,ws);

int iIcmpDataSize = 0;

struct sockaddr_in dest,from;

unsigned int addr = 0;

struct hostent *hp;

char buffer[1024];

char recv_buffer[1024];

if(argc 2)

{

fprintf(stderr, "Usage: %s [host|ip] [datasize]\r\n", argv[0]);

return 0;

}

if (argc 2)

iIcmpDataSize = atoi(argv[2]);

if (iIcmpDataSize 1 || iIcmpDataSize 1024)

iIcmpDataSize = 10;

memset(dest, 0, sizeof dest);

dest.sin_family = AF_INET;

hp = gethostbyname(argv[1]);

if (!hp)

addr = inet_addr(argv[1]);

if ((!hp) (addr == INADDR_NONE))

{

fprintf(stderr,"Unable to resolve %s\r\n",argv[1]);

return 0;

}

if (hp != NULL)

memcpy((dest.sin_addr), hp-h_addr,hp-h_length);

else

dest.sin_addr.s_addr = addr;

int sockfd;

sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

fprintf(stdout, "XPing...\r\n");

for (int i = 0; i 3; i++)

{

fprintf(stdout, "Echo...\r\n");

memset(buffer, 0, 1024);

fill_IcmpData(buffer, iIcmpDataSize);

fill_IcmpHeader(buffer, iIcmpDataSize);

XIcmpHeader *icmp_hdr = (XIcmpHeader *)buffer;

int iSendSize = sendto(sockfd, buffer, sizeof(XIcmpHeader) + iIcmpDataSize, 0, (struct sockaddr*)dest, sizeof(dest));

fprintf(stdout, "Reply...\r\n");

memset(from, 0, sizeof from);

memset(recv_buffer, 0, 1024);

int fromlen = sizeof(from);

int iRecvSize = recvfrom(sockfd, recv_buffer, 1024, 0, (struct sockaddr*)from, fromlen);

if (iRecvSize 0)

decode_IpIcmp(recv_buffer, iRecvSize);

}

WSACleanup();

return ret;

}

ping命令大全?

-a 将目标的机器标识转换为ip地址 -t 若使用者不人为中断会不断的ping下去 -c count 要求ping命令连续发送数据包,直到发出并接收到count个请求 -d 为使用的套接字打开调试状态 -f 是一种快速方式ping。使得ping输出数据包的速度和数据包从远程主机返回一样快,或者更快,达到每秒100次。在这种方式下,每个请求用一个句点表示。对于每一个响应打印一个空格键。 -i seconds 在两次数据包发送之间间隔一定的秒数。不能同-f一起使用。 -n 只使用数字方式。在一般情况下ping会试图把IP地址转换成主机名。这个选项要求ping打印IP地址而不去查找用符号表示的名字。如果由于某种原因无法使用本地DNS服务器这个选项就很重要了。 -p pattern 拥护可以通过这个选项标识16 pad字节,把这些字节加入数据包中。当在网络中诊断与数据有关的错误时这个选项就非常有用。 -q 使ping只在开始和结束时打印一些概要信息。 -R 把ICMP RECORD-ROUTE选项加入到ECHO_REQUEST数据包中,要求在数据包中记录路由,这样当数据返回时ping就可以把路由信息打印出来。每个数据包只能记录9个路由节点。许多主机忽略或者放弃这个选项。 -r 使ping命令旁路掉用于发送数据包的正常路由表。 -s packetsize 使用户能够标识出要发送数据的字节数。缺省是56个字符,再加上8个字节的ICMP数据头,共64个ICMP数据字节。 -v 使ping处于verbose方式。它要ping命令除了打印ECHO-RESPONSE数据包之外,还打印其它所有返回的ICMP数据包。

C语言编写一个调用PING命令程序怎么写?请给个完整的代码

用system函数简单调用ping命令:

#include "stdio.h"

void main()

{

char ip[15];

char command[50];

// printf("enter IP please: ");

scanf("%s",ip[0]); //输入要ping的ip

sprintf(command,"ping %s",ip);

system(command);

exit(0);

}

如何在Delphi中实现PING,谢谢各位大侠

在 delphi 中实现 ping 的功能,比较简单的办法:

一、直接调用 windows 的 ping 命令,然后获取其输出信息。

二、借用 Indy 组件包中的 TIdIcmpClient 组件(代码来源于网上):

procedure TForm1.Button1Click(Sender: TObject);var i : Integer;begin Memo1.Lines.Clear; IdIcmpClient1.Host:= Edit1.Text; //计算机的名称或IP地址 IdIcmpClient1.ReceiveTimeout:=1000; //最大超时时间 Button1.Enabled := false; try for i:=0 to 13 do begin IdIcmpClient1.Ping; Application.ProcessMessages ; //延时 end; finally Button1.Enabled := true; end;end;procedure TForm1.IdIcmpClient1Reply(ASender: TComponent; const AReplyStatus: TReplyStatus);var sTime: string; begin //检测Ping的回复错误 if (AReplyStatus.MsRoundTripTime = 0 ) then sTime := '1' else sTime := '='; //在列表框中显示Ping消息 Memo1.Lines.Add(Format('Reply from [%s] : Bytes=%d time%s%d ms TTL=%d', [AReplyStatus.FromIpAddress, AReplyStatus.BytesReceived, sTime, AReplyStatus.MsRoundTripTime, AReplyStatus.TimeToLive]));end;

三、自己编写 ping 函数,实现功能代码。

c语言ping程序中文注释

编写自己的一个ping程序,可以说是许多人迈出网络编程的第一步吧!!这个ping程序的源代码经过我的修改和调试,基本上可以取代windows中自带的ping程序. 各个模块后都有我的详细注释和修改日志,希望能够对大家的学习有所帮助!!

/* 本程序的主要源代码来自MSDN网站, 笔者只是做了一些改进和注释! 另外需要注意的是在Build之前,必须加入ws2_32.lib库文件,否则会提示"error LNK2001:"的错误!*/

Version 1.1 修改记录:

1 解决了socket阻塞的问题,从而能够正确地处理超时的请求!

2 增加了由用户控制发送ICMP包的数目的功能(即命令的第二个参数)

3 增加了对ping结果的统计功能.

#pragma pack(4)

#include "winsock2.h"

#include "stdlib.h"

#include "stdio.h"

#define ICMP_ECHO 8

#define ICMP_ECHOREPLY 0

#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)

/* The IP header */

typedef struct iphdr {

unsigned int h_len:4; // length of the header

unsigned int version:4; // Version of IP

unsigned char tos; // Type of service

unsigned short total_len; // total length of the packet

unsigned short ident; // unique identifier

unsigned short frag_and_flags; // flags

unsigned char ttl;

unsigned char proto; // protocol (TCP, UDP etc)

unsigned short checksum; // IP checksum

unsigned int sourceIP;

unsigned int destIP;

}IpHeader;

//

// ICMP header

//

typedef struct icmphdr {

BYTE i_type;

BYTE i_code; /* type sub code */

USHORT i_cksum;

USHORT i_id;

USHORT i_seq;

/* This is not the std header, but we reserve space for time */

ULONG timestamp;

}IcmpHeader;

#define STATUS_FAILED 0xFFFF

#define DEF_PACKET_SIZE 32

#define DEF_PACKET_NUMBER 4 /* 发送数据报的个数 */

#define MAX_PACKET 1024

#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))

#define xfree(p) HeapFree (GetProcessHeap(),0,(p))

void fill_icmp_data(char *, int);

USHORT checksum(USHORT *, int);

int decode_resp(char *,int ,struct sockaddr_in *);

void Usage(char *progname){

fprintf(stderr,"Usage:\n");

fprintf(stderr,"%s [number of packets] [data_size]\n",progname);

fprintf(stderr,"datasize can be up to 1Kb\n");

ExitProcess(STATUS_FAILED);

}

int main(int argc, char **argv){

WSADATA wsaData;

SOCKET sockRaw;

struct sockaddr_in dest,from;

struct hostent * hp;

int bread,datasize,times;

int fromlen = sizeof(from);

int timeout = 1000;

int statistic = 0; /* 用于统计结果 */

char *dest_ip;

char *icmp_data;

char *recvbuf;

unsigned int addr=0;

USHORT seq_no = 0;

if (WSAStartup(MAKEWORD(2,1),wsaData) != 0){

fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());

ExitProcess(STATUS_FAILED);

}

if (argc 2 ) {

Usage(argv[0]);

}

sockRaw = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL, 0,WSA_FLAG_OVERLAPPED);

//

//注:为了使用发送接收超时设置(即设置SO_RCVTIMEO, SO_SNDTIMEO),

// 必须将标志位设为WSA_FLAG_OVERLAPPED !

//

if (sockRaw == INVALID_SOCKET) {

fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());

ExitProcess(STATUS_FAILED);

}

bread = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)timeout,

sizeof(timeout));

if(bread == SOCKET_ERROR) {

fprintf(stderr,"failed to set recv timeout: %d\n",WSAGetLastError());

ExitProcess(STATUS_FAILED);

}

timeout = 1000;

bread = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)timeout,

sizeof(timeout));

if(bread == SOCKET_ERROR) {

fprintf(stderr,"failed to set send timeout: %d\n",WSAGetLastError());

ExitProcess(STATUS_FAILED);

}

memset(dest,0,sizeof(dest));

hp = gethostbyname(argv[1]);

if (!hp){

addr = inet_addr(argv[1]);

}

if ((!hp) (addr == INADDR_NONE) ) {

fprintf(stderr,"Unable to resolve %s\n",argv[1]);

ExitProcess(STATUS_FAILED);

}

if (hp != NULL)

memcpy((dest.sin_addr),hp-h_addr,hp-h_length);

else

dest.sin_addr.s_addr = addr;

if (hp)

dest.sin_family = hp-h_addrtype;

else

dest.sin_family = AF_INET;

dest_ip = inet_ntoa(dest.sin_addr);

//

// atoi函数原型是: int atoi( const char *string );

// The return value is 0 if the input cannot be converted to an integer !

//

if(argc2)

{

times=atoi(argv[2]);

if(times == 0)

times=DEF_PACKET_NUMBER;

}

else

times=DEF_PACKET_NUMBER;

if (argc 3)

{

datasize = atoi(argv[3]);

if (datasize == 0)

datasize = DEF_PACKET_SIZE;

if (datasize 1024) /* 用户给出的数据包大小太大 */

{

fprintf(stderr,"WARNING : data_size is too large !\n");

datasize = DEF_PACKET_SIZE;

}

}

else

datasize = DEF_PACKET_SIZE;

datasize += sizeof(IcmpHeader);

icmp_data = (char*)xmalloc(MAX_PACKET);

recvbuf = (char*)xmalloc(MAX_PACKET);

if (!icmp_data) {

fprintf(stderr,"HeapAlloc failed %d\n",GetLastError());

ExitProcess(STATUS_FAILED);

}

memset(icmp_data,0,MAX_PACKET);

fill_icmp_data(icmp_data,datasize);

//

//显示提示信息

//

fprintf(stdout,"\nPinging %s ....\n\n",dest_ip);

for(int i=0;i{

int bwrote;

((IcmpHeader*)icmp_data)-i_cksum = 0;

((IcmpHeader*)icmp_data)-timestamp = GetTickCount();

((IcmpHeader*)icmp_data)-i_seq = seq_no++;

((IcmpHeader*)icmp_data)-i_cksum = checksum((USHORT*)icmp_data,datasize);

bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)dest,sizeof(dest));

if (bwrote == SOCKET_ERROR){

if (WSAGetLastError() == WSAETIMEDOUT) {

printf("Request timed out.\n");

continue;

}

fprintf(stderr,"sendto failed: %d\n",WSAGetLastError());

ExitProcess(STATUS_FAILED);

}

if (bwrote datasize ) {

fprintf(stdout,"Wrote %d bytes\n",bwrote);

}

bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)from,fromlen);

if (bread == SOCKET_ERROR){

if (WSAGetLastError() == WSAETIMEDOUT) {

printf("Request timed out.\n");

continue;

}

fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError());

ExitProcess(STATUS_FAILED);

}

if(!decode_resp(recvbuf,bread,from))

statistic++; /* 成功接收的数目++ */

Sleep(1000);

}

/*

Display the statistic result

*/

fprintf(stdout,"\nPing statistics for %s \n",dest_ip);

fprintf(stdout," Packets: Sent = %d,Received = %d, Lost = %d (%2.0f%% loss)\n",times,

statistic,(times-statistic),(float)(times-statistic)/times*100);

WSACleanup();

return 0;

}

/*

The response is an IP packet. We must decode the IP header to locate

the ICMP data

*/

int decode_resp(char *buf, int bytes,struct sockaddr_in *from) {

IpHeader *iphdr;

IcmpHeader *icmphdr;

unsigned short iphdrlen;

iphdr = (IpHeader *)buf;

iphdrlen = (iphdr-h_len) * 4 ; // number of 32-bit words *4 = bytes

if (bytes iphdrlen + ICMP_MIN) {

printf("Too few bytes from %s\n",inet_ntoa(from-sin_addr));

}

icmphdr = (IcmpHeader*)(buf + iphdrlen);

if (icmphdr-i_type != ICMP_ECHOREPLY) {

fprintf(stderr,"non-echo type %d recvd\n",icmphdr-i_type);

return 1;

}

if (icmphdr-i_id != (USHORT)GetCurrentProcessId()) {

fprintf(stderr,"someone else''s packet!\n");

return 1;

}

printf("%d bytes from %s:",bytes, inet_ntoa(from-sin_addr));

printf(" icmp_seq = %d. ",icmphdr-i_seq);

printf(" time: %d ms ",GetTickCount()-icmphdr-timestamp);

printf("\n");

return 0;

}

USHORT checksum(USHORT *buffer, int size) {

unsigned long cksum=0;

while(size 1) {

cksum+=*buffer++;

size -=sizeof(USHORT);

}

if(size) {

cksum += *(UCHAR*)buffer;

}

cksum = (cksum 16) + (cksum 0xffff);

cksum += (cksum 16);

return (USHORT)(~cksum);

}

/*

Helper function to fill in various stuff in our ICMP request.

*/

void fill_icmp_data(char * icmp_data, int datasize){

IcmpHeader *icmp_hdr;

char *datapart;

icmp_hdr = (IcmpHeader*)icmp_data;

icmp_hdr-i_type = ICMP_ECHO;

icmp_hdr-i_code = 0;

icmp_hdr-i_id = (USHORT)GetCurrentProcessId();

icmp_hdr-i_cksum = 0;

icmp_hdr-i_seq = 0;

datapart = icmp_data + sizeof(IcmpHeader);

//

// Place some junk in the buffer.

//

memset(datapart,''E'', datasize - sizeof(IcmpHeader));

}

/******************* 附: ping命令执行时显示的画面 ****************\

* C:\Documents and settings\houzhijiangping 236.56.54.12 * * *

* Pinging 236.56.54.12 with 32 bytes of data: *

* *

* Request timed out. *

* Request timed out. *

* Request timed out. *

* Request timed out. *

* *

* Ping statistics for 236.56.54.12: *

* Packets: Sent = 4, Received = 0, Lost = 4 (100% loss), *

* *

\**************************************************************/

/**************************************************************\

* C:\Documents and Settings\houzhijiangping 127.0.0.1 *

* *

* Pinging 127.0.0.1 with 32 bytes of data: *

* *

* Reply from 127.0.0.1: bytes=32 time1ms TTL=128 *

* Reply from 127.0.0.1: bytes=32 time1ms TTL=128 *

* Reply from 127.0.0.1: bytes=32 time1ms TTL=128 *

* Reply from 127.0.0.1: bytes=32 time1ms TTL=128 *

* *

* Ping statistics for 127.0.0.1: *

* Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), *

* Approximate round trip times in milli-seconds: *

* Minimum = 0ms, Maximum = 0ms, Average = 0ms *

* *

\**************************************************************/

ping命令源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于ping命令原理详解、ping命令源代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/21944.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载