首页 -> 网络技术 -> 技术前哨 -> 正文
Ping的源代码

#pragma pack(4)

#define WIN32_LEAN_AND_MEAN

#include

#include

#include

#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 _ihdr {

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 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);

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

void Usage(char *progname){

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

fprintf(stderr,"%s [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;

int fromlen = sizeof(from);

int timeout = 1000;

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,0);

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);

if (argc >2) {

datasize = atoi(argv[2]);

if (datasize == 0)

datasize = DEF_PACKET_SIZE;

}

else

datasize = DEF_PACKET_SIZE;

datasize += sizeof(IcmpHeader);

icmp_data = xmalloc(MAX_PACKET);

recvbuf = 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);

while(1) {

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("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("timed out\n");

continue;

}

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

ExitProcess(STATUS_FAILED);

}

decode_resp(recvbuf,bread,&from);

Sleep(1000);

}

return 0;

}

/*

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

the ICMP data

*/

void 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;

}

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

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

return ;

}

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");

}

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专题文章列表

·Ping程序在TCP/IP中的应用

·Ping命令应用实例三则

·如何正确使用Windows的Ping命令

·如何使用ping和tracert命令检测丢包

·使用Ping命令细节点特别提醒

·ping的作用

·高效排除网络故障 从用好Ping命令开始

·网关无法Ping通故障及解决方法

·通过ping检测网络故障的典型次序

·通过Ping命令排除路由器故障

·网管应透过现象轻松解决Ping故障

·检测网络故障的利器!ping命令的使用

·启用IP安全策略防Ping

·IPSec安全策略 防Ping还是要慎用

·Ping命令幕后过程及其返回信息分析

·教你快速深入了解Ping

·什么是Ping不能告诉你的?

·Ping的工作过程及单向Ping通的原因

·Ping的源代码

·show,ping,trace and debug 命令介绍

·网络不通不用愁 Ping命令来帮忙

·完美解决Vista不能Ping问题

·Ping命令不能PING通的种种解惑

·四个Ping命令判断网络的故障

·使用PING判断TCP/IP网络故障

·浅谈IP安全策略:防范被Ping与封闭端口

·伪装IP地址的洪水Ping攻击

·不可忽视 彻底封杀Ping命令漏洞

  • 闂佽崵濮风亸銊╁箯閿燂拷5G-A闂傚倸鍊风欢锟犲礈濞嗗緷娲煛閸滃啰绋忛梺鍛婄矤濡撅拷 闂傚倸鍊风欢锟犲磻閸涘瓨鍎楁い鏃傛櫕閳瑰秴鈹戦悩鎻掝仾闁稿锕㈤幃姗€鎮欑捄杞版睏闂佽崵鍠撻幊鎾诲煡婢舵劕绠荤紒娑滎潐閺佸墽绱撴担椋庘敀闁告梹鍨甸锝夊矗婢跺牆浜伴梺鍓茬厛閸犳牠鐛€n剛纾藉ù锝堫潐閳锋帡鏌涚€c劌鈧繈宕洪埀顒併亜閹烘埊鏀婚悗姘炬嫹 ...
  • 闂佽崵濮崇拃锕傚垂閸洖绠栭柦妯猴級閻旂厧鍨傛い鏃傛嚀娴滈箖鏌熸潏楣冩闁哄拋鍓熼弻銊╂偆閸屾稑顏�2025濠德板€楁慨鐑藉磻閻愬唽缂氭繛鍡樺灱婵娊鏌熼幆鐗堫棄缂佺姵濞婇弻鏇熺箾閸喖濮庨悶姘卞枛閹鎮欓悷鎵冲亾濠靛牏纾芥慨姗€顤傞弫濠囨煥閻曞倹瀚�1.9婵犵數鍋為崹鍫曞箰缁嬫5娲晲婢跺鍘掗梺璺ㄥ櫐閹凤拷5G-A闂傚倷鑳剁涵鍫曞疾椤忓牆绠柨鐕傛嫹...
  • 闂佽崵濮崇拃锕傚垂鐠鸿櫣鏆︽俊銈呮噹鎯熼悷婊冮叄濮婄厧饪伴崗鐐洴閺佹劙宕卞▎蹇婂従闂傚倷绀佸鍓佸垝鎼淬劌鐒垫い鎺戝亞閺€鐗堢箾婢跺鈽夐柍钘夘樀瀹曞綊顢曢妶鍌涚亙闂備焦鎮堕崕婊堝礃閵婏箒鐧佺紓鍌氬€搁崐鎼佸疮椤栫偛鍨傞柛锔诲幖閸ㄦ繈鏌涢幘鑼妽閻庢碍宀搁弻锟犲炊閳轰絿銏犆归悪鈧崹鍫曞箖濡法鐤€闁规儳澧庨鍥煟韫囨挻绂嬮柛銊ョ埣楠炲繘宕橀钘夋疅闂侀潧顦崕鎶藉储闁秵鐓熼柣鏂垮濞堬綁鏌熼崙銈嗗...
  • 闂佽崵濮崇拃锕傚垂閸洖鍨傞柟顖嗏偓閸亪鏌涘☉鍗炵仭婵絽鐗撳娲川婵犲啠鎷圭紓浣割儐閹稿墽妲愰悙鏉戠窞鐎光偓閳ь剛澹曢崗鑲╃瘈鐟滄棃寮鈧畷鎴﹀箻閺傘儲鏂€闂佸憡绋掓竟鍡浰囨导瀛樷拺闁告繂瀚崳浠嬫煕鎼存稑鈧繂鐣烽敐鍡樺劅闁靛繆鎳囬弸鏍⒑閸濆嫮鈻夐柛瀣噹閳诲秹寮撮悩顐壕闁绘劗鎳撻埀顒佺箘缁辨挸顫濇0婵囨櫓闂佸搫娲ㄩ崑鎰板几閺嶎厽鐓忓┑鐐茬仢閸旀氨鈧鍠楁繛濠囧蓟閿熺姴纾兼繛鎴炵懅閸戔剝绻濆▓鍨珯闁瑰嚖鎷�...
  • 闂佽崵濮崇拃锕傚垂鐠鸿櫣鏆﹂柣妯烘▕濞撳鏌熼鍡楀閸撶敻姊绘担鐟邦嚋缂佸甯¢幊婵囥偅閸愩劍妲梺璺ㄥ櫐閹凤拷2027濠德板€楁慨鐑藉磻閻愬唽缂氭繛鍡樺灱婵娊鏌熼幆鐗堫棄缂佲偓閸岀偞鐓忓┑鐐靛亾濞呭棙淇婂鐓庡闁诡喗顨婂畷鐑筋敇閻愮増鍩涙俊銈囧Х閸庢垿骞忛敓锟�5G闂備浇宕甸崰鎰版偡閵壯€鍋撳鐓庡绩闁哥噥鍨跺娲川婵犲嫬顫ч梺缁橆殕濞叉粓鎳為柆宥嗘櫢闁跨噦鎷�...
  • 闂佽崵濮崇拃锕傚垂閸洖绠栭柕澶涢檮缂嶅洭鏌嶉崫鍕殭缂傚秴瀚换娑㈡晲閸涱喚顦遍梺閫炲苯澧查悘蹇旂懇閹虫牠顢欑喊杈╁數婵☆偆澧楃换鈧紒銊ヮ煼閹ǹ绠涢敐鍛画闂佹寧绋戦崯鏉戭嚕閸婄噥妯侀梺鍛婏供閸撶喖寮婚悢鐓庡瀭婵炴垶眉婢规洟姊绘担鍛婃儓闁绘绮撳畷瑙勫鐎涙ê浠兼繝闈涘€搁幉锟犲疾椤掍焦鍙忔慨妤€妫楁禍顖炴煕濮楀棗澧撮柡灞剧洴婵$兘顢涘☉姗嗕紦5G闂傚倷绀侀幉锛勬暜濡ゅ啰鐭欓柟鐑橆殔閽冪喖鏌ㄩ悤鍌涘...
  • 闂佽崵濮崇拃锕傚垂閹峰矈鏆伴梻浣芥硶閸o箓骞忛敓锟�5G闂傚倸鍊风欢锟犲磻閸℃稑绐楅幖杈剧岛閸嬫挾鎲撮崟顐熸灆閻庢鍠楅幐鍐差嚕閸洖绠i柣鎰级缁楀酣姊绘担鍦菇闁告柨鐬奸埀顒佸嚬閸欏啴銆佸鑸靛亹闁汇垽娼ч弳妤呮⒑閹勭闁稿瀚伴幆鍐晸閿燂拷5G 闂傚倷绀侀幖顐も偓姘煎墯椤ㄣ儵骞栨担鍝ヮ槹闂佸憡鎸嗛崟顐ゅ酱闂備礁鎼ú銊︽叏鐎涙ḿ顩锋い鏍仦閻撴瑩鎮楀☉娆嬬細濠⒀勫▕閺岋綁鏁傞崗鐓庮伓...
  • 闂佽崵濮风亸銊╁箯閿燂拷5G闂傚倷绀佺紞濠囧疾閺屻儲鍤勯柛顐f礃閸嬨劑鎮归崶銊с偞闁绘劖娲熼弻锟犲礃閵婏箑绐涚紓浣哄Т椤兘寮婚妸銉㈡婵☆垵鍋愰崝顔剧磽娴e摜鐒鹃柛鎾跺枎閻g兘鏁撻悩鎻掔哎闂佹悶鍨哄Λ鍐蓟閿熺姴绀冮柍鍝勫€归悗顖炴⒑閸濄儱鍓遍柛鎾寸〒濡叉劙寮崼婵堫吅闂佺粯锚閻忔艾鐣烽悢鍏尖拺婵懓娲ら悘顕€鏌涢悩鑼fい銊e劦瀹曞爼顢楅埀顒傜矆婢舵劖鐓ラ柣鏇炲€圭€氾拷 ...
  • 闂佽崵濮崇拃锕傚垂閹惰棄鐒垫い鎺戝€归弳鈺冪磼椤曞懎鐏︽鐐寸墵瀹曨偊濡烽敃鈧娑㈡⒑濮瑰洤濡介柕鍫暜闂備浇宕垫慨宥夊礃閹冨闂備胶枪缁绘垿鏁冮姀鐘垫殾闁跨喓濮寸粈鍐┿亜閹炬瀚弶鎼佹⒒娴g晫姣囬柛鎰╁妿缁嬪繒绱撴担璇℃闁瑰嚖鎷� 缂傚倸鍊搁崐鎼佸疮椤栫偛鍨傞柛锔诲幖閸ㄦ繈鏌涢幘鑼额唹闁稿鎹囬幃鐑芥焽閿斿彨锕傛⒑閸涘﹦鎳冪紒缁樺姍椤㈡艾鈻庨幇鈺佷喊濠电偛妫欓崕鎶藉疾閿燂拷...
  • 闂佽崵濮崇拃锕傚垂鐠鸿櫣鏆﹂悹楦裤€€濡插牊淇婇婵嗕汗鐎规洘妞藉娲川婵犲倸姣堥梺鎼炲妿婢ф骞堥妸鈺佺厸闁告劦浜欑粭澶娾攽鎺抽崐鎰板磻閹炬枼鏀芥い鏃囧亹缁犵増銇勯弴顏嗙М鐎规洦鍋婂畷鐔碱敇閻愬瓨娈㈤梻鍌欐祰椤顪冮崸妤€鍌ㄥù鐘差儌閳ь剚姊归幏鍛存倻濡桨绮ч梺璇茬箳閸嬬姴螞閸曨噮鏉� 闂傚倸鍊搁崐鎼佹偋閸曨垰鍨傜憸鐗堝笒缁犳牗绻濇繝鍌涘櫧濞戞挸绉垫穱濠囧Χ閸屾矮澹曞┑鐘愁問閸犳牜鎹㈤幒鏃€顫曢柡鍐ㄧ墛閺呮悂鏌ㄩ悤鍌涘...
  • 闂佽崵濮惧▍锝夊几閸滅瘡C闂傚倷鐒︾€笛呯矙閹达附鍎楀ù锝囩摂閺嗕即姊婚崒娆戭槮闁靛洦锕㈤幊妤呭礈娴h櫣顦繝銏f硾閻偐澹曢崗鑲╃瘈濠电姴鍊搁弳锝夋煙閸撴彃澧撮柡灞剧☉閳诲酣骞囬澶嬵棑闂備線鈧偛鑻晶顖滅磼椤旇偐效鐎殿喚绮换婵嬪炊閵娿儰铏庨梻浣稿暱閹碱偊宕愭繝姘ュ┑鐘叉处閻撳啴鏌曟径妯虹仭閻庢熬鎷� ...
  • 闂佽崵濮崇拃锕傚垂閾忣偆顩烽柨鏇炲€搁惌妤佷繆椤栨壕鎷¢柛瀣ㄥ姂濮婃椽鎳濇导鏉戞懙濠碘槅鍋勯崯鎾春閳ь剚銇勯幒宥嗙グ濠㈣锕㈤弻娑樷枎韫囨洜顔掗悗瑙勬礃缁诲倿鍩ユ径濞㈢喖鎮℃惔锝嗘闂備浇顕х花鑲╁緤婵犳熬缍栧鑸靛姈閸婂灚銇勯幒鎴濃偓濠氬础濮橆厹浜滈柡宥冨妼閹肩ǹ霉濠婂骸鐏¢柟渚垮妼椤粓宕奸悢濂変紦 婵犵數鍎戠徊钘壝洪敂鐐床闁割偅绺鹃弸鏂棵归悡搴f憼闁绘帞绮幈銊ヮ潨閸℃ぞ绨电紓浣筋嚙濡稓妲愰幘璇茬闁圭ǹ楠搁锟�...
  • 文章搜索

    覆盖全国各省会城市及海外城市的网速测试
    →选择要测试的地区
    →选择目标测试点
    >> 测试点注册
    婵犵數鍋炲ḿ娆擃敄閸儲鍎婃い鏍仦閸ゅ倿鏌¢崘銊モ偓鍦矆閿燂拷 | 闂備胶绮〃鍛存偋婵犲倴缂氶柛顐ゅ枔閻濆爼鏌eΔ鈧悧濠囷綖閿燂拷 | 闂佽崵濮烽崑妯肩矆娓氣偓瀹曘垽濡舵径濠勯獓闂佹枼鏅涢崰姘跺磿閿燂拷 | 闂傚倸鍊搁幊蹇涘礉濡ゅ拑缍栭柛鈩冡缚閳瑰秵绻濋棃娑欐悙鐞氾拷 | 婵°倗濮烽崑娑㈡倶濠靛绠熼柨鐔哄Т鐎氬鈧箍鍎遍幊搴綖閿燂拷 | 闂備礁鎼悧鍡欑矓鐎涙ɑ鍙忛柣鏂挎憸閳绘梹銇勯幘璺轰户濠碘槄鎷� | 闂備胶枪缁绘劙宕㈤弽顐ュС妞ゆ帒瀚粻锝夋煙鐎涙ḿ鐭嬬紒顕嗘嫹
    ©2000 - 2025 濠电偞鍨堕幐濠氭偋濠婂牆鐤炬い鎰╁€楃壕楣冩煙鐎电ǹ啸闁圭櫢鎷� 闂備胶绮〃鍛存偋婵犲倴缂氶柛顐犲劚缁犮儵鏌嶈閸撶喎顕i崹顐㈢窞婵炴垶姘ㄩ敍锟�