網路程式之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...