1 / 55

IPv6 網路程式設計 ( TCP Client/Server)

IPv6 網路程式設計 ( TCP Client/Server). 授課老師:陳懷恩 助教:邱俊傑、江鴻毅、朱健隴 國立宜蘭大學 資訊工程研究所. 課程目標. 教同學 們 使用 Microsoft Visual Studio 2008 以及 C 語言寫出 IPv6 TCP 的 Server 端與 Client 端 程式. TCP Client-Server 建構流程圖. 1. 建立 Socket( 使用 Socket() 函數 ). 2. 連結 Socket( 使用 bind() 函數 ). 3. 開啟 listening socket.

gracie
Download Presentation

IPv6 網路程式設計 ( TCP Client/Server)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. IPv6網路程式設計(TCP Client/Server) 授課老師:陳懷恩 助教:邱俊傑、江鴻毅、朱健隴 國立宜蘭大學 資訊工程研究所

  2. 課程目標 教同學們使用Microsoft Visual Studio 2008以及C語言寫出IPv6TCP的Server端與 Client 端 程式

  3. TCP Client-Server建構流程圖 1.建立Socket(使用 Socket()函數) 2.連結Socket(使用 bind()函數) 3.開啟listening socket 1.建立Socket(使用 Socket()函數) 4.等待接受Client 端連線 要求 2.使用Connect()函 數連線要求 3.Send()函數送出 資料給Server 5.使用recv()接收資料 4.使用recv()接收 資料 6.send()函數送出 關閉Socket(使用close()函數)

  4. TCP Server端程式 (1/7) • 程式宣告 • #include <winsock2.h> //連結WinSock基本函式 • #include <stdio.h> //連結C基本輸入輸出函式 • #include <ws2tcpip.h> //連結微軟所提供的TCP/IP基本函式 • #pragma comment(lib, "WS2_32.lib") //連結Wsock32.lib資料庫

  5. TCP Server端程式 (2/7) • 主程式-宣告 • void main() { • intFromLen; //宣告一個儲存長度的變數 • char *Address ="2001:e10:1440:1:5003:317f:8e8d:dc58"; • char *Port = "5001"; //宣告Server的port • char Buffer[1024]= ""; //宣告Buffer大小為1024位元 • ADDRINFO Hints, *AddrInfo; //宣告Hints與*AddrInfo資料結構 • SOCKADDR_STORAGE From; //宣告From • SOCKET ServSock,msgsock; //宣告接收和發送的Sockets 這個部分請同學填寫伺服器的IPv6位址

  6. TCP Server端程式 (3/7) • 主程式-呼叫指定的Winsock DLL • WORD wVersionRequested; • wVersionRequested = MAKEWORD( 2, 2 ); // Socket最高的版本。 // 高位指定次要版本; 低位指定主要版本。 • WSADATA wsaData; //這個結構被用於存放初始化數據到WSAStartup。 • WSAStartup( wVersionRequested, &wsaData ); • 此為微軟系統中必要呼叫Socket程式之固定寫法

  7. TCP Server端程式 (4/7) • 主程式-Hints • memset(&Hints, 0, sizeof(Hints)); //清除Hints記憶體 • Hints.ai_family = PF_INET6; //選擇使用IPv6 • Hints.ai_socktype = SOCK_STREAM;//選擇使用TCP • Hints.ai_flags = AI_NUMERICHOST | AI_PASSIVE; //AI_NUMERICHOST是將旗標設定為二進位(101) //AI_PASSIVE是將旗標設定為bind()中使用位址返回函數 • getaddrinfo(Address,Port,&Hints,&AddrInfo); //將Address與Port寫入AddrInfo

  8. TCP Server端程式 (5/7) • 主程式-建立Socket • ServSock=socket(PF_INET6, SOCK_STREAM,0); //建立Server端Socket使用IPv6與TCP • if(bind(ServSock,AddrInfo->ai_addr,AddrInfo->ai_addrlen) >= 0 ); //綁定Socket於AddrInfo所指定的IP位址 • printf("bind TCP_V6OK\n"); //顯示字串 • listen(ServSock, 5); //設定可連入5個連線 • FromLen=sizeof(From); //設定sockaddr長度 printf()是輸出輸入函式庫中的函式

  9. TCP Server端程式 (6/7) • 主程式-迴圈 • while(1){ • msgsock=accept(ServSock, (LPSOCKADDR) & From,&FromLen); //msgsock為接受Client連入的Socket //(ServSock的SOCKET,自己的位置Form,Form的長度) • printf("accept new socket\n"); //顯示"accept new socket"字串 • recv(msgsock,Buffer,1024,0); //接收 msgsock傳入資料存入Buffer • printf("Server收到:%s\n", Buffer); //顯示Buffer中儲存的字串 • send(msgsock, Buffer, sizeof(Buffer), 0); //回傳 Buffer中的資料給Client }

  10. TCP Server端程式 (7/7) • 主程式-結束 • closesocket(msgsock); //關閉Client Socket • WSACleanup(); //清空回傳值 } 結束先前建立的socket 可與WSAStartup()函式相呼應(第6頁)

  11. TCP Client端程式 (1/8) • 程式宣告 • #include <winsock2.h> //連結WinSock基本函式 • #include <stdio.h> //連結C基本輸入輸出函式 • #include <ws2tcpip.h> //連結微軟提供的TCP/IP基本函式 • #pragma comment(lib, "WS2_32.lib") //連結Wsock32.lib資料庫 同學注意到了嗎?這個部分與Server端程式相同。

  12. TCP Client端程式(2/7) • 主程式-宣告 • void main() { • char *Server = "2001:e10:1440:1:5003:317f:8e8d:dc58"; //指定Server IPv6位址 • char *Port = "5001"; //指定Server的port為5001 • char recvbuffer[1024]; //宣告接收站存區大小為1024位元 • ADDRINFO Hints, *AddrInfo; //宣告Hints與*AddrInfo資料結構 這個部分請同學填寫你要連線的電腦 IPv6位址

  13. TCP Client端程式 (3/7) • 主程式-呼叫指定的Winsock DLL • WORD wVersionRequested; • wVersionRequested = MAKEWORD( 2, 2 ); // Socket最高的版本。 // 高位指定次要版本; 低位指定主要版本。 • WSADATA wsaData; //這個結構被用於存放初始化數據到WSAStartup。 • WSAStartup( wVersionRequested, &wsaData ); • 此為微軟系統中必要呼叫Socket程式之固定寫法 這個部分與Server端程式相同

  14. TCP Client端程式 (4/7) • 主程式-Hints • memset(&Hints,0,sizeof(Hints));//清除Hints記憶體 • Hints.ai_family = PF_INET6; //選擇使用IPv6 • Hints.ai_socktype = SOCK_STREAM;//選擇使用TCP • getaddrinfo(Server ,Port,&Hints,&AddrInfo); //取得到位址與PORT號並轉換ANSI host名稱為一個可用的位址 這個部分與Server端程式相同

  15. TCP Client端程式 (5/7) • 主程式-建立SOCKET • SOCKET sockClient; //宣告一個名為sockClient的SOCKET • 主程式-迴圈 • while(1){ • sockClient = socket( PF_INET6, SOCK_STREAM, 0 ) ; //取得到伺服器位址與port號 • connect(sockClient,AddrInfo->ai_addr, AddrInfo->ai_addrlen); //連結到sockClient的位置,位置長度(寫入while可讓程式一直和server持續進行) • char buffer[1024]=""; //宣告發送資料的長度

  16. TCP Client端程式 (6/7) • printf("input message:");//顯示input message: • scanf("%s",buffer);//輸入的字串填入buffer • send(sockClient,buffer ,sizeof(buffer), 0); //送出buffer中的資料(使用者輸入的) // sockClient的資料為buffer,長度,0 • recv(sockClient,recvbuffer, sizeof(recvbuffer), 0); // 接收Server回傳的資料 // 資料儲存於recvbuffer中 • printf("Receive:%s\n",recvbuffer); //顯示接收到字串 }

  17. TCP Client端程式 (7/7) • 主程式-結束 • closesocket(sockClient); //關閉Client Socket • WSACleanup(); //清空回傳值 } 結束Socket,這個部分與Server端程式相同。

  18. 課堂作業01 • 助教將於課堂上公布 Server IP位址 • Server Port為 5001 • 請同學寫出 IPv6 TCPClient端 程式 • 輸入學號發送到Server端 • 助教確認正確收到即算完成作業

  19. IPv6網路程式設計(UDP Client/Server) 授課老師:陳懷恩 助教:邱俊傑、江鴻毅、朱健隴 國立宜蘭大學 資訊工程研究所

  20. 課程目標 教同學們使用Microsoft Visual Studio 2008以及C語言寫出IPv6UDP的Server端與 Client 端程式

  21. UDP Client-Server建構流程圖 1.建立Socket(使用 Socket函數) 2.連結Socket(使用 bind函數) 3.以recvfrom()函數接 收Client端傳來的資 料 1. 建立Socket(使用Socket 函數) 2.以Sendto()函數傳送資料 給Server端 3.以recvfrom()函數接收 Server端傳來的資料 4.以Sendto()函數傳送資 料給Client端 4.關閉Socket(使用Close ()函數) 5.關閉Socket(使用Close ()函數)

  22. UDP Server端程式(1/7) • 程式宣告 • #include <winsock2.h> //連結WinSock基本函式 • #include <stdio.h> //連結C基本輸入輸出函式 • #include <ws2tcpip.h> //連結微軟所提供的TCP/IP基本函式 • #pragma comment(lib, "WS2_32.lib") //連結Wsock32.lib資料庫

  23. UDP Server端程式(2/7) 這個部分請同學填寫伺服器的IPv6位址 • 主程式-宣告 • void main() { • char *Server= "2001:e10:1440:1:5003:317f:8e8d:dc58"; • char *Port= "5001"; //宣告Server的port • char recvBuf[1024]; //宣告Buffer大小為1024位元 • ADDRINFO Hints, *AddrInfo; //宣告Hints與*AddrInfo資料結構 • SOCKADDR_STORAGE From; //宣告From為一個SOCKADDR_STORAGE的結構

  24. UDP Server端程式(3/7) • 主程式-呼叫指定的Winsock DLL • WORD wVersionRequested; • wVersionRequested = MAKEWORD( 2, 2 ); // Socket最高的版本。 // 高位指定次要版本; 低位指定主要版本。 • WSADATA wsaData; //這個結構被用於存放初始化數據到WSAStartup。 • WSAStartup( wVersionRequested, &wsaData ); • 此為微軟系統中必要呼叫Socket程式之固定寫法

  25. UDP Server端程式(4/7) • 主程式-Hints • memset(&Hints,0,sizeof(Hints));//清除Hints記憶體 • Hints.ai_family = PF_INET6;//選擇使用IPv6 • Hints.ai_socktype=SOCK_DGRAM;//選擇使用UDP • getaddrinfo(Server,Port,&Hints,&AddrInfo); //取得到位址與PORT號並轉換ANSI host名稱為一個可用的位址

  26. UDP Server端程式(5/7) • 主程式-建立SOCKET • SOCKET sockSrv=socket(PF_INET6,SOCK_DGRAM, 0); //取得到伺服器位址與port號 • bind(sockSrv, AddrInfo->ai_addr, AddrInfo->ai_addrlen); //綁定Socket於某個IP位址 • printf("bind UDP_v6 OK\n"); //顯示bind UDP_v6 OK • intlen=sizeof(From); //宣告 len為 sockaddr長度

  27. UDP Server端程式(6/7) • 主程式-迴圈 • while(1){ • recvfrom(sockSrv,recvBuf,sizeof (recvBuf),0,(LPSOCKADDR)&From,&len); • printf("%s\n",recvBuf); //顯示接收到字串 • sendto(sockSrv, recvBuf, sizeof (recvBuf),0,(LPSOCKADDR)&From,sizeof (From)); • printf("ACK %s\n",recvBuf); //顯示傳送到字串 }

  28. UDP Server端程式(7/7) • 主程式-結束 • closesocket(sockSrv); //關閉Client Socket • WSACleanup(); //清空回傳值 }

  29. UDP Client端程式(1/7) • 程式宣告 • #include <winsock2.h> //連結WinSock基本函式 • #include <stdio.h> //連結C基本輸入輸出函式 • #include <ws2tcpip.h> //連結微軟所提供的TCP/IP基本函式 • #pragma comment(lib, "WS2_32.lib") //連結Wsock32.lib資料庫

  30. UDP Client端程式(2/7) • 主程式-宣告 • void main() { • char *Server = "2001:e10:1440:1:5003:317f:8e8d:dc58"; //指定Server IPv6位址 • char *Port = "5001"; //指定Server的port • char recvbuffer[1024]; //接收資料的長度 • ADDRINFO Hints, *AddrInfo; //宣告Hints與*AddrInfo資料結構

  31. UDP Client端程式(3/7) • 主程式-呼叫指定的Winsock DLL • WORD wVersionRequested; • wVersionRequested = MAKEWORD( 2, 2 ); // Socket最高的版本。 // 高位指定次要版本; 低位指定主要版本。 • WSADATA wsaData; //這個結構被用於存放初始化數據到WSAStartup。 • WSAStartup( wVersionRequested, &wsaData ); • 此為微軟系統中必要呼叫Socket程式之固定寫法

  32. UDP Client端程式(4/7) • 主程式-Hints • memset(&Hints,0,sizeof(Hints));//清除Hints記憶體 • Hints.ai_family = PF_INET6;//選擇使用IPv6 • Hints.ai_socktype=SOCK_DGRAM;//選擇使用UDP • getaddrinfo(Server,Port,&Hints,&AddrInfo); //取得到位址與PORT號並轉換ANSI host名稱為一個可用的位址

  33. UDP Client端程式(5/7) • 主程式-建立SOCKET • SOCKET sockClient=socket(PF_INET6,SOCK_DGRAM,0); //取得到伺服器位址與port號

  34. UDP Client端程式(6/7) • 主程式-迴圈 • while(1){ • char buffer[1024]=""; //宣告Buffer大小為1024位元 • printf("input message:"); //顯示input message: • scanf("%s",buffer);//輸入的字串填入buffer • sendto(sockClient,buffer,sizeof(buffer),0, AddrInfo->ai_addr, AddrInfo->ai_addrlen); //送出buffer中的資料(使用者輸入的) • recvfrom(sockClient,recvbuffer,50,0,NULL,NULL); //接收Server回傳的資料 • printf("%s\n",recvbuffer);//顯示接收到字串 }

  35. UDP Client端程式(7/7) • 主程式-結束 • closesocket(sockClient); //關閉Client Socket • WSACleanup(); //清空回傳值 }

  36. 課堂作業02 • 請同學分組(基本上兩人一組)。 • 一位同學寫UDP Client;另一位寫UDP Server。(自行協調) • 展示Client/Server互相傳遞訊息即算完成作業。

  37. 網路封包分析軟體教學(Wireshark) 授課老師:陳懷恩 助教:邱俊傑、江鴻毅、朱健隴 國立宜蘭大學 資訊工程研究所

  38. 課程目標 讓同學學會安裝並使用Wireshark抓取封包。藉此可以協助同學確認前次兩作業的成果,亦可以協助後續封包分析與除錯。

  39. Wireshark開啟時畫面 • 程式下載點:http://www.wireshark.org/download.html

  40. 選擇抓取封包網卡(1/2) • 點選紅色框來選擇抓取封包之網卡 或選實體網路卡

  41. 選擇抓取封包網卡(2/2) • 顯示電腦所有網路介面卡的列表 • 如何正確選擇網卡? • 網卡名稱 • IP位址 • 有封包進出之網卡

  42. 抓取封包設定(1/6) 1 • 點選紅色框來修改擷取封包設定 • 三個選項均可設定 2 3

  43. 抓取封包設定(2/6) • 選擇網卡

  44. 抓取封包設定(3/6) • 選擇儲存文件

  45. 抓取封包設定(4/6) • 設定停止參數 • 擷取數量 • 擷取大小 • 擷取時間

  46. 抓取封包設定(5/6) • 顯示選項

  47. 抓取封包設定(6/6) • 名稱解析

  48. Wireshark抓取封包畫面 封包列表 封包標頭解析 印出封包16進位 與ASCII

  49. 抓取封包畫面-功能(1/3) • 重新選擇網卡 • 暫停抓取封包 • 重新抓取封包 暫停 重新

  50. 抓取封包畫面-功能(2/3) • 過濾擷取出來封包(過濾條件如下) • ip.src== 120.100.111.10 (擷取120.100.111.10來源IP封包) • tcp/dup(選擇擷取Protocal) • 可以做邏輯運算(e.g. tcp || udp) 過濾條件

More Related