tracert程式的實現

2021-10-14 16:09:05 字數 4333 閱讀 7593

計算機網路課程設計

開發環境:

作業系統:window 10

編譯環境:vc 6.0(用dev無法編譯)

程式語言:c++

執行程式時需關閉電腦防火牆以便獲取全部資料
**如下:

#include

#include

#include

using

namespace std;

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

//ip報頭

typedef

struct ip_header

ip_header;

//icmp報頭

typedef

struct icmp_header

icmp_header;

//報文解碼結構

typedef

struct decode_result

decode_result;

//計算網際校驗和函式

ushort checksum

( ushort *pbuf,

int isize )

if( isize )

//如果 isize 為正,即為奇數個位元組

cksum =

( cksum >>16)

+( cksum&

0xffff);

cksum +

=( cksum >>16)

;return

(ushort)

(~cksum );}

//對資料報進行解碼

bool decodeicmpresponse

(char

* pbuf,

int ipacketsize, decode_result &decoderesult,

byte icmp_echo_reply, byte icmp_timeout)

else

if( picmphdr-

>type == icmp_timeout )

//icmp超時差錯報文

else

//檢查id和序列號以確定收到期待資料報

if( usid !=

( ushort )

getcurrentprocessid()

|| ussquno != decoderesult.usseqno )

//記錄ip位址並計算往返時間

decoderesult.dwipaddr.s_addr = piphdr-

>sourceip;

decoderesult.dwroundtriptime =

gettickcount()

- decoderesult.dwroundtriptime;

//處理正確收到的icmp資料報

if( picmphdr-

>type == icmp_echo_reply || picmphdr-

>type == icmp_timeout )

return

true;}

void

main()

else

}int def_max_hop;

printf

("本程式需要客戶指定輸出多少次時間記錄,請輸入乙個x(x為整數)");

//程式提供了"-n"選項,用以輸出指定次數的時間記錄。

scanf

("%d"

,&def_max_hop)

; cout<<

"tracing roote to "

<" with a maximum of "

<< def_max_hop <<

" hops.\n"

sockaddr_in destsockaddr;

zeromemory

(&destsockaddr,

sizeof

( sockaddr_in ));

destsockaddr.sin_family = af_inet;

destsockaddr.sin_addr.s_addr = uldestip;

//建立原始套接字

socket sockraw =

wsasocket

( af_inet, sock_raw, ipproto_icmp,

null,0

;//超時時間

int itimeout =

3000

;//設定接收超時時間

setsockopt

( sockraw, sol_socket, so_rcvtimeo,

(char*)

&itimeout,

sizeof

( itimeout ));

//設定傳送超時時間

setsockopt

(sockraw,sol_socket,so_sndtimeo,

(char*)

&itimeout,

sizeof

(itimeout));

//構造icmp回顯請求訊息,並以ttl遞增的順序傳送報文

//icmp型別字段

const byte icmp_echo_request =8;

//請求回顯

const byte icmp_echo_reply =0;

//回顯應答

const byte icmp_timeout =11;

//傳輸超時

//其他常量定義

const

int def_icmp_data_size =32;

//icmp報文預設資料字段長度

const

int max_icmp_packet_size =

1024

;//icmp報文最大長度(包括報頭)

const dword def_icmp_timeout =

3000

;//回顯應答超時時間

//填充icmp報文中每次傳送時不變的字段

char icmpsendbuf[

sizeof

( icmp_header )

+ def_icmp_data_size ]

;//傳送緩衝區

memset

( icmpsendbuf,0,

sizeof

( icmpsendbuf ));

//初始化傳送緩衝區

char icmprecvbuf[ max_icmp_packet_size ]

;//接收緩衝區

memset

( icmprecvbuf,0,

sizeof

( icmprecvbuf ));

//初始化接收緩衝區

icmp_header * picmpheader =

( icmp_header*

)icmpsendbuf;

picmpheader-

>type = icmp_echo_request;

//型別為請求回顯

picmpheader-

>code =0;

//**欄位為0

picmpheader-

>id =

(ushort)

getcurrentprocessid()

;//id欄位為當前程序號

memset

( icmpsendbuf +

sizeof

( icmp_header )

,'e'

, def_icmp_data_size )

;//資料字段

ushort usseqno =0;

//icmp報文序列號

int ittl =1;

//ttl初始值為1

bool breachdesthost = false;

//迴圈退出標誌

int imaxhot = def_max_hop;

//迴圈的最大次數

decode_result decoderesult;

//傳遞給報文解碼函式的結構化引數

while

(!breachdesthost && imaxhot--)}

elseif(

wsagetlasterror()

== wsaetimedout )

//接收超時,輸出*號

else

} ittl++

;//遞增ttl值

}}

tracert 路由跟蹤程式

c users administrator tracert 10.0.0.1 通過最多 30 個躍點跟蹤到 10.0.0.1 的路由 1 1 毫秒 1 ms 3 ms 192.168.1.1 2 1 毫秒 1 ms 1 ms 10.0.0.1 跟蹤完成。c users administrator t...

必備的網路常用測試命令(tracert命令)

tracert traceroute 路由跟蹤 跟蹤路由資訊,使用此命令可以查出資料從本地機器傳輸到目標主機所經過的所有途徑,這對我們了解網路布局和結構很有幫助。格式 tracert d h maximum hops j host list w timeout r s srcaddr 4 6 tar...

tracert中三個時間的含義

可以看到每一跳都有三個時間,三個時間都表示什麼呢?tracert 每一跳會發出三個ttl包 ttl time to live 是ip協議包中的乙個值,它告訴網路,資料報在網路中的時間是否太長而應被丟棄。返回三個時間都是從上個節點到這個節點的時間,三個數字都表示ping值,其中最後乙個位址表示的目的位...