ping命令源代码(ping命令原理详解)
admin 发布:2022-12-19 20:02 150
本篇文章给大家谈谈ping命令源代码,以及ping命令原理详解对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、ping 命令详解
- 2、代码编程——ping命令流程(图)
- 3、ping命令大全?
- 4、C语言编写一个调用PING命令程序怎么写?请给个完整的代码
- 5、如何在Delphi中实现PING,谢谢各位大侠
- 6、c语言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站长 原创,转载请注明出处和附带本文链接;
相关推荐
- 05-02怎么交易源代码(源码交易网站有哪些)[20240502更新]
- 05-02hibernate的分页查询完整源代码(基于hibernate的分页查询)[20240502更新]
- 05-02源代码小说百度(小说 源代码)[20240502更新]
- 05-02超级马里奥c源代码(马里奥c++源代码)[20240502更新]
- 05-02网页源代码翻译器(html网页源码翻译工具)[20240502更新]
- 05-02ecshop3.0源代码(ecshop v41)[20240502更新]
- 05-02ie内核源代码(IE内核版本)[20240502更新]
- 05-02源代码百度云盘(源代码电影下载百度云)[20240502更新]
- 05-02网站源代码查看软件(查看网页源代码这个软件怎么使用)[20240502更新]
- 05-02电池均衡源代码(电池均衡系统)[20240502更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接