網路程式設計 Week3

簡介 Winsock

Winsock 故名思意是 Windows Socket,它提供了非常多功能還傳遞網路資訊。
而 WSA 是 Windows Socket API 的縮寫。 在寫程式之前有裝了 MinGW(Minimalist GNU for Windows)官方網站, 安裝完後還要在自己的環境設定 Compiler。

第一題

  • 使用 wireshark 分別抓 DNS query 與 response 封包

  • DNS query demo

  • DNS response(No such name) demo

第二題

  • 印出 subnet 的所有 ip 其 domain name

    Note : 注意 inet_addr() 裡的形態是 C-String

#include <iostream>
#include <winsock.h>
#include <string>

using namespace std;

void printAddressContent(LPHOSTENT &pointer);

int main()
{
    WSADATA data;
    WSAStartup(0x101, (LPWSADATA) &data);

    LPHOSTENT  host_pointer;
    struct in_addr address;

    const string IP_PREFIX = "140.130.175.";
    string temp;
    for (int i=1;i<=255;i++) {
        temp = IP_PREFIX + to_string(i);
        cout << "------------------------" << endl;
        cout << temp << endl;
        address.s_addr = inet_addr(temp.c_str());
        host_pointer = gethostbyaddr((LPSTR) &address, sizeof(address), AF_INET);
        printAddressContent(host_pointer);
    }

    return 0;
}

void printAddressContent(LPHOSTENT &pointer) {
    if (pointer == nullptr) {
        cout << "Error: pointer is null." << endl;
        return ;
    }

    cout << "Name: " << pointer->h_name << endl;
    cout << "Aliases: " << pointer->h_aliases << endl;
    cout << "Length: " << pointer->h_length << endl;

    return ;
}
  • 結果 demo

本週心得

這次使用到很久沒碰的 C++ ,有些許陌生! 學到了一些 winsock 的 function,查詢了 DNS,也用 wireshark 截取封包資訊,好充實!