---
# System prepended metadata

title: net w2
tags: [network]

---

# 網路程式設計 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的語法。
