網路程式之ping指令的實現

2021-04-12 19:09:23 字數 2090 閱讀 8510

網路程式之ping指令的實現

ping是用於探測網路的連通性的乙個程式.它在網路程式設計中主要是用到了原始套接字層.用raw程式設計是一件很有意思的事情.因為這可以自已自定義ip位址,自定義資料結構.能做自已想做的事情.是socket中最底層的程式設計技術.

ping的原理其實就是自定義乙個報文,傳送到目地主機.然後等對方的返回資訊.來確認網路是否連通.下面是**:

//#define u_char unsigned char

//#define u_short unsigned short

#include

#define icmp_echoreply 0

#define icmp_echoreq 8 //

typedef struct tagipdr

iphdr,*piphdr;//rfc791 的ip協議頭型別

typedef struct tagicmp

icmphdr,*picmphdr;//rfc 792 icmp協議頭 /

#define req_datasize 32

typedef struct tagechorequest

echorequest,*pechorequest;//請求回傳的資料長度

///typedef struct tagechoreply

echoreply,*pechoreply;//回送請求報文

#include

#include

#include

dword time;

void ping(lpcstr pstrhost);//ping 指令函式;

void reporterror(lpcstr psrtfrom);

int waitforechoreply(socket s);

int sendechorequest(socket,lpsockaddr_in);

dword recvechoreply(socket,lpsockaddr_in,char*);

u_short in_cksum(u_short *addr,int len);

void main()

if(wsadata.wversion!=version)

bool flag=true;

while(flag)

wsacleanup(); }

void ping(lpcstr pstrhost)

lphost=gethostbyname(pstrhost);

if(lphost==null)

sadest.sin_addr.s_addr=*((u_long far*)(lphost->h_addr));

sadest.sin_family=af_inet;

sadest.sin_port=0;

printf("/n探測主機%s[%s]:%d位元組/n",pstrhost,inet_ntoa(sadest.sin_addr),req_datasize);

for(nloop=0;nloop<4;nloop++)

if(!nret)

dwtimesent=recvechoreply(rawsocket,&sasrc,(char*)&cttl);

dwelapsed=time-dwtimesent; }

if(closesocket(rawsocket)==socket_error)

reporterror("關閉套接字"); }

int sendechorequest(socket s,lpsockaddr_in lpsttoaddr)

if(nleft==1)

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

sum+=(sum>>16);

answer=~sum;

return answer; }

用這個程式可以做為乙個子模組來處理網路中故障結點發現.因為如果網路中一台主機ping不到的話我們可以認為連通這台機器的網路出了故障.(令主機接收ping時).這樣不斷輸入子網中的ip就可以得到本網路中的連通性.

同時也可以應用到網路主機探測中,可以通過分析本機ip來自動生區域網ip位址類別.然後再進行探測就可以得出本地網路的拓撲結構圖了.

網路學習之ping指令

和同學聊天的時候被問到這樣乙個問題 在虛擬環境路由中主機a ping主機b的時間 加上主機b ping主機c的時間 為什麼比主機a ping主機c的時間長?我們經常使用ping指令探測主機間是否通訊,然而細究起來還是一知半解,所以這個問題也引起了我的興趣。windows系統下開啟cmd命令列工具就可...

ping程式的實現

最近在看些windows下網路程式設計問題。看到原始套接字的使用,於是看了ping程式的功能實現。大部分人用ping命令只是作為檢視另乙個系統的網路連線是否正常的一種簡單方法。這裡我介紹下在windows下實現ping程式的兩種方法。一是使用原始套接字的方法 如下 include pragmacom...

C 製作網路Ping程式

判斷網路是否通達。我們一般會使用命令列下的ping。但如果想在c gui程式中內建ping程式來完成一些功能,可以使用system.net.networkinformation命名空間中的pingreply類來完成所需要的功能。程式介面所用控制項 textbox name txthostnameor...