# 網路程式設計 hw2 ## 1. 使用wireshark分別抓反查範例的DNS query與response封包 ### 反查 query ![image](https://hackmd.io/_uploads/SkCUdqAn6.png) - Query: 8.8.8.8之IP位置 ### 反查response ![image](https://hackmd.io/_uploads/SkE6_cRhT.png) - Answer:dns.google ### 分析 - sourse IP:192.168.1.116 - dest. IP: 192.168.1.1 (My local DNS) ## 2. 印出subnet的所有ip其domain name - 程式 ```c++= #include <iostream> #include <cstring> #include <winsock.h> #include <iomanip> using namespace std; int main(int argc, char **argv){ // windows socket set up WSADATA wsadata; WSAStartup(0x101,(LPWSADATA) &wsadata); // Input class-C IP address string subnetAddress; cout << "Please enter Class-C ip address(format xxx.xxx.xxx.): "; cin >> subnetAddress; // use array to sperate class-C IP addresses int addrssArr[3]; char dot; sscanf(subnetAddress.c_str(), "%d.%d.%d%c", &addrssArr[0], &addrssArr[1], &addrssArr[2], &dot); // Enforce data integrity if (dot != '.' || addrssArr[0]<0 || addrssArr[0]>255 || addrssArr[1]<0 || addrssArr[1]>255 || addrssArr[2]<0 || addrssArr[2]>255 ){ cerr << "Incorrect Argument!"; return 1; } cout << left<<setw(15)<<"IP Address"<<"\tDomain Name" << endl; // Start query DNS form xxx.xxx.xxx.1 to xxx.xxx.xxx.255 for (int i=1;i<256;i++){ // Get IP address string s = to_string(addrssArr[0]) + "." + to_string(addrssArr[1]) + "." + to_string(addrssArr[2]) + "." + to_string(i) ; // let std::string to Cstring char ipaddr[s.size() + 1]; strcpy(ipaddr, s.c_str()); // Query Dns LPHOSTENT hp; struct in_addr sAddr; sAddr.s_addr=inet_addr(ipaddr); hp= gethostbyaddr((LPSTR) &sAddr, sizeof(sAddr),AF_INET); if (hp == nullptr){ // if not Found => continue continue; } // Output Result cout<<left<<setw(15)<<s<<"\t"<<left<<setw(15)<<hp->h_name<<"\n"; } return 0; } ``` - 執行結果 ![image](https://hackmd.io/_uploads/Bkv_e116p.png) ## 3. 本週心得 我想要抱怨Cstring超難用:(。 這周教了winsock與DNS的基本概念,我也學會了編寫簡單的程式來查詢一個IP範圍的DNS域名。 我印象最深刻的是這周作業的程式碼,因為我使用C/C++撰寫,所以程式碼相當落落長,而且winsock的出現較早,因此只支援Cstring傳入,這剛好是我非常不熟悉的東西,因此我今天查了好多Cstring的語法。