pic server 뇐ꟷ(9)ꅘꕈ vb 덝군 tcp/udp ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf ·...

24
PIC_SERVER 教材(9)—以 VB 設計 TCP/UDP 之網路傳輸應用 http://GRC.yzu.edu.tw/ 1 作者:蔡宗成(2005-01-26);推薦:吳昌暉、徐業良(2005-01-26);最近更新:徐業良 (2005-02-27)PIC_SERVER 教材(9)—以 VB 設計 TCP/UDP 之網路傳輸應用 本文首先介紹使用 Visual Basic 所提供的 Microsoft Winsock Control 控制元件 (MSWINSCK.OCX),設計 UDP TCP 兩種通訊協定的 Client Server 應用程式, 達成訊息傳遞功能。了解 Visual Basic UDP/TCP 的基本功能後,就可自行開發 PIC_SERVER UDP/TCP 應用程式。 1. Microsoft Winsock Control 控制元件簡介 Microsoft Winsock Control 控制元件支援 UDP(User Datagram Protocol) TCP(Transmission Control Protocol)兩種通訊協定。 UDP 是非連結式通訊協定,不須建 立特定的網路連結,只要設定電腦間的 IP 位址與使用相同的 Port,即可互相傳遞訊 息。TCP 是連結式通訊協定,用戶端電腦與伺服端電腦必須先建立網路連結,便可在 此連結下,互相傳遞資料與訊息。 使用 UDP 通訊協定發送訊息相當於寄普通信件,郵局不會告知寄件人是否將信 件送達至收件人;使用 TCP 通訊協定則相當於寄雙掛號信件,郵局會告知寄件人是 否已將信件送達收件人(若未完成則會有逾時 timeout 信號)。UDP 可說是發了就不 管,TCP 則會在時限之內,若沒有回音就不斷嘗試重發,因此在網路吵雜的環境裡, TCP 成功完成傳信任務的機率較高,但效率也較低且耗時,且成功完成傳信任務並不 保證信中的內容無誤。 Visual Basic 提供一項 Microsoft Winsock Control 控制元件(MSWINSCK.OCX)作為程式設計者開發應用程式與 UDPTCP 通訊協定之間的橋樑,不須深入了解網 路傳輸的理論,只要設定此控制元件所提供的屬性(Properties),應用其事件(Events)

Upload: others

Post on 31-Oct-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 1

作作者者::蔡蔡宗宗成成((22000055--0011--2266));;推推薦薦::吳吳昌昌暉暉、、徐徐業業良良((22000055--0011--2266));;最最近近更更新新::徐徐業業良良

((22000055--0022--2277))。。

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

本文首先介紹使用 Visual Basic 所提供的 Microsoft Winsock Control 控制元件(MSWINSCK.OCX),設計 UDP與 TCP兩種通訊協定的 Client與 Server應用程式,達成訊息傳遞功能。了解 Visual Basic 的 UDP/TCP 的基本功能後,就可自行開發PIC_SERVER的 UDP/TCP應用程式。

1. Microsoft Winsock Control控制元件簡介

Microsoft Winsock Control 控制元件支援 UDP(User Datagram Protocol)與TCP(Transmission Control Protocol)兩種通訊協定。UDP是非連結式通訊協定,不須建立特定的網路連結,只要設定電腦間的 IP 位址與使用相同的 Port,即可互相傳遞訊息。TCP是連結式通訊協定,用戶端電腦與伺服端電腦必須先建立網路連結,便可在此連結下,互相傳遞資料與訊息。

使用 UDP 通訊協定發送訊息相當於寄普通信件,郵局不會告知寄件人是否將信件送達至收件人;使用 TCP 通訊協定則相當於寄雙掛號信件,郵局會告知寄件人是否已將信件送達收件人(若未完成則會有逾時 timeout 信號)。UDP 可說是發了就不管,TCP則會在時限之內,若沒有回音就不斷嘗試重發,因此在網路吵雜的環境裡,TCP成功完成傳信任務的機率較高,但效率也較低且耗時,且成功完成傳信任務並不保證信中的內容無誤。

Visual Basic提供一項Microsoft Winsock Control控制元件(MSWINSCK.OCX),作為程式設計者開發應用程式與 UDP、TCP 通訊協定之間的橋樑,不須深入了解網路傳輸的理論,只要設定此控制元件所提供的屬性(Properties),應用其事件(Events)

Page 2: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 2

及方法(Methods),即可開發 Client(用戶端:主動先開口尋求連結)與 Server(伺服端:被動答話接受連結)應用程式。

由於Microsoft Winsock Control控制元件並不是 VB預設的控制元件,所以必須自行引用至程式專案中。如圖 1,在 VB程式專案中,選擇專案 設定使用元件 選

擇Microsoft Winsock Control 6.0,雙擊Microsoft Winsock Control 6.0控制元件後,便會出現在程式專案裡。

圖 1(a). 設定使用元件

Page 3: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 3

圖 1(b). 選擇Microsoft Winsock Control 6.0

Page 4: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 4

圖 1(c). 引用至程式裡

Client/Server架構中“請求-回應”過程之執行流程如圖 2,敘述如下:

(1) 如圖 2(a),Server端必須先建立可以提供 Client端連結的功能,成為“Listen”狀態,等待 Client端連接,而 Client端則在“Connect”狀態,嘗試與 Server端建立連結。

(2) 當 Server端接收到來自 Client端的「連結請求(Connection Request)」,Server端裡的Microsoft Winsock Control控制元件產生“ConnectionRequest”事件,在此事件中,利用“Accept”方法接收來自 Client端的請求,如圖 2(b)。

(3) 如圖 2(c),Client端與 Server端建立連結後,Client端開始對 Server端傳送資料(SendData),Server 端的 Microsoft Winsock Control 控制元件同時產生“DataArrival”事件,在此事件中,利用“GetData”方法接收 Client 端所傳送來之資料。

(4) 如圖 2(d),Server 端也可以傳送資料給 Client 端,稱為「回應(Response)」,程序同步驟(3)。

Page 5: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 5

用戶端Client

Connect

伺服端Server

Accept連結請求

用戶端Client

Connect

伺服端Server

Accept連結請求

圖 2(a). 嘗試建立連結

用戶端Client

Connect

伺服端Server

Accept允許建立連結

用戶端Client

Connect

伺服端Server

Accept允許建立連結

圖 2(b). 建立連結

用戶端Client

SendData

伺服端Server

GetDataDataArrival

用戶端Client

SendData

伺服端Server

GetDataDataArrival

圖 2(c). Client端傳送資料至 Server端

用戶端Client

GetData

伺服端Server

SendDataDataArrival

用戶端Client

GetData

伺服端Server

SendDataDataArrival

圖 2(d). 回應資料

2. 以 VB建立 UDP對話視窗範例程式

UDP 是非連結式的通訊協定,主要目的在高速傳遞資料。UDP 不須先建立通訊連結,只要設定電腦間的 IP 位置與使用相同的 Port,節省建立連結時間(所以才能高速傳遞資料),但 UDP不提供資料錯誤的偵測及資料重送等機制,無法確保資料能完整送達。

本節介紹以 VB建立 UDP對話視窗之範例程式。Client端範例程式收錄在資料夾C:\YZ_PIC\Samples\pic_SERVER\VB\TCP_UDP\UDP_Client\UDP_Client.vbp, Server端為 C:\YZ_PIC\Samples\pic_SERVER\VB\TCP_UDP\UDP_Client\UDP_Server.vbp。

Page 6: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 6

2.1 Client端範例程式

Client端範例程式外觀如圖 3,設計 Host_IP、Port、Msg欄提供使用者輸入數值,一空白視窗將 Server端傳回的訊息顯示出來,Send按鈕作為連接和傳輸。表 1為Client端範例程式所引用的基本控制元件與其屬性值,注意對應前述4個欄位的4個TextBox設定值分別為“remote_UDP_server_IP”、“remote_port”、“Msg”、和“Server_reply”,Command_button 的設定為“Send_button”。此外 Winsock 命名為 WskClient,採用之Protocal為 1-sckUDPProtocol。

圖 3. Client端範例程式外觀

Page 7: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 7

表 1. UDP_Client表單之元件與屬性

元件 屬性 設定值 Name frmClient

Form Caption UDP_Client

Frame Name Frame1 Name Label1

Label Caption Host_IP Name Label2

Label Caption Port Name Label3

Label Caption Msg Name Msg

TextBox Text Hi, there.

Name remote_port TextBox

Text 1055 Name remote_UDP_server_IP

TextBox Text 140.138.139.41

Name Server_reply TextBox

Text Name Send_button

CommandButton Caption Send Name WskClient

Winsock Protocol 1-sckUDPProtocol

圖 4 為 Client 端範例程式程式碼。當使用者按下 Send_button 按鈕後(Send_button_Click()),設定 WskClient.RemoteHost(Winsock Client端欲連結遠端的主機名稱或 IP 位址)為 remote_UDP_server_IP(remote_UDP_server_IP 文字框裡的IP),WskClient.RemotePort(Winsock Client 端欲連結遠端的主機使用的 Port)為remote_port(remote_port文字框裡的 Port),並使用 SendData方法傳送Msg文字框裡的內容。

當 UDP_Client收到遠方資料傳送過來時,啟動Microsoft Winsock Control控制元件的 DataArrival 事件(WskClient_DataArrival()),定義 strData 為一字串變數,使用GetData方法接收資料,並將 strData資料顯示在 Server_reply文字框裡。

Page 8: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 8

圖 4. UDP_Client之程式碼

2.2 Server端範例程式

Server 端範例程式外觀如圖 5,設計 Local_IP 欄顯示 Server 端的 IP 位址,Port欄提供使用者設定本 Server 連接 Port,Msg 欄將 Client 端傳來的訊息顯示出來,debug_info 欄作為顯示速度測試訊息之用,並設計 Update 按鈕作為更新訊息。表 2為 Server端範例程式所引用的基本控制元件與其屬性值,注意對應前述 4個欄位的 4個 TextBox 設定值分別為 “ServerIP”、 “ServerPort”、 “Msg”、和 “debug_info”,Command_button的設定為“Update_button”。此外Winsock命名為WskServer,採用之Protocal為 1-sckUDPProtocol。

圖 5. Server端範例程式外觀

Page 9: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 9

表 2. UDP_Server表單之元件與屬性

元件 屬性 設定值 Name frmServer

Form Caption UDP_Server

Frame Name Frame1 Name Label1

Label Caption Local_IP Name Label2

Label Caption Port Name Label3

Label Caption Msg Name debug_info

TextBox Text

Name Msg TextBox

Text Name ServerIP

TextBox Text 192.11.79.158

Name ServerPort TextBox

Text 1055 Name Update_button

CommandButton Caption Update Name WskServer

Winsock Protocol 1-sckUDPProtocol

圖 6為 UDP_Server之程式碼。在副程式 From_Load裡,首先顯示 Server端的 IP位址,並呼叫 Update_button_Click副程式。

在副程式 Update_button_Click 裡,使用者每按下 Update_button 一次,先關掉Microsoft Winsock Control控制元件,並使用 Bind方法設定 Server端的連接 Port,接著清空Msg文字框與 debug_info文字框裡的內容,msg_count變數歸零。

當收到 Client 端送來資料時,啟動 Microsoft Winsock Control 控制元件的DataArrival事件(WskServer_DataArrival()),定義 strData為一字串變數,使用 GetData方法接收資料,並將資料顯示在 Msg 文字框中,同時將收到時間、訊息長度、收到訊息次數顯示在 debug_info文字框中。接著再將收到通知、收到時間、Client端位址、Port等相關資訊,利用 SendData方法自動回傳資料至 Client端。

Page 10: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 10

圖 6. UDP_Server之程式碼

2.3 UDP程式測試

啟動資料夾 C:\YZ_PIC\Samples\pic_SERVER\VB\TCP_UDP裡的 UDP_Client.exe與 UDP_Server.exe範例程式執行檔,在同一部電腦(IP:140.138.*.*)中進行測試,圖 7(a)為執行結果。如圖 7(b),在 UDP_Client,欲連結端 Host_IP必須設定為(140.138.*.*),Port設定為 1055,Msg文字框裡寫入 Hi, there.,按下 Send按鈕,便將資料傳送至指定 IP與 Port的 Server端。

UDP_Server執行時,會讀取 Server端的 IP位址,顯示在 Local_IP文字框,Port設定為 1055,UDP_Server接收到 UDP_Client傳來的資料,並將資料顯示在 Msg文字框內,再自動回傳資料給 UDP_Client,在 UDP_Server,按下 Updata 按鈕可清空Msg文字框與 debug_info文字框內容。UDP_Server每接收到一次資料時,msg_count便會累計加 1。

Page 11: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 11

圖 7(a). 啟動UDP_Client.exe與UDP_Server.exe範例程式執行檔

圖 7(b). UDP_Client與UDP_Server傳送與接收過程

3. 以 VB建立 TCP對話視窗範例程式

TCP 是連結式通訊協定,主要目的在提供大量資料的傳遞並確保其傳遞資料無誤,有提供錯誤偵測、資料復原及資料重送等機制。TCP在傳送資料前,會在 Server端與 Client端間建立通訊連結,再互相傳送資料。

Page 12: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 12

本節介紹以 VB建立 TCP對話視窗之範例程式。Client端範例程式收錄在資料夾C:\YZ_PIC\Samples\pic_SERVER\VB\TCP_UDP\TCP_Client\TCP_Client.vbp , Server端為 C:\YZ_PIC\Samples\pic_SERVER\VB\TCP_UDP\TCP_Server\TCP_Server.vbp。

3.1 Client端範例程式

Client端範例程式外觀如圖 8,同樣設計 Host_IP、Port、Msg欄提供使用者輸入數值,一空白視窗將 Server 端傳回的訊息顯示出來,Send 按鈕作為連接和傳輸,並增加一 Status欄位,顯示目前連結狀況。引用元件除Microsoft Winsock Control 6.0控制元件外,還增加了一個 Timer作為連線實際時之用。表 3為 Client端範例程式所引用的基本控制元件與其屬性值,注意對應前述 4個欄位的 4個 TextBox設定值分別為“remote_IP”、“remote_port”、“Msg”、和“Message_from_Server”,Command_button的設定為 “Send_button”。此外 Winsock 命名為 WskClient,採用之 Protocal 為0-sckTCPProtocol,Timer則命名為 Timer1。

圖 8. Client端範例程式外觀

Page 13: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 13

表 3. TCP_Client表單之元件與屬性

元件 屬性 設定值 Name frmClient

Form Caption TCP_Client

Frame Name Frame1 Name ClientStatus

Label Caption Not Connected Name Label1

Label Caption Host_IP Name Label2

Label Caption Port Name Label3

Label Caption Status : Name Label4

Label Caption Msg Name Label5

Label Caption Name Message_from_Server

TextBox Text

Name Msg TextBox

Text Anybody home ? Name remote_IP

TextBox Text 140.138.139.41

Name remote_Port TextBox

Text 83 Name Send_button

CommandButton Caption Send Name Timer1

Timer Enable False Name WskClient

Winsock Protocol 0-sckTCPProtocol

圖 9為 TCP_Client之程式碼。當按下 Send_button時,啟動 Timer1,並設定 Timer1的時間週期為 3000ms,清空Message_from_Server文字框,WskClient的 State值為 6時,代表正在嘗試與 Server端連線中,如果不等於 6,設定欲連結 Server端的 IP位址與 Port,並執行WskClient_Connect副程式,代表已連線成功。否則 ClientStatus顯示“Connecting…”。

Page 14: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 14

在WskClient_Connect副程式中,當連線成功時,ClientStatus顯示”Connected.”,並將Msg文字框裡的內容藉由Microsoft Winsock Control控制元件的 SendData方法傳送出去。

當 Client端接收到資料時,啟動 DataArrival事件,定義 strData為一字串變數,使用GetData方法接收此 strData資料,將所接收到的資料顯示在Message_from_Server文字框,接著結束連線,ClientStatus顯示“Disconnected.”,關閉 Timer1。

在 Timer1_Timer副程式裡,當 Timer1啟動後經過 3000ms還無法與 Server端建立連線,便結束連線,ClientStatus顯示“Not Connected.”,並出現訊息提示框(MsgBox)告知“Failed to send message in 3 sec.”。

圖 9. TCP_Client之程式碼

3.2 Server端範例程式

Client端範例程式外觀如圖 10,同樣設計 Local_IP欄顯示 Server端的 IP位址,Port欄提供使用者設定本 Server連接 Port,Msg欄將 Client端傳來的訊息顯示出來,

Page 15: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 15

debug_info欄作為顯示速度測試訊息之用,Update按鈕作為更新訊息,並增加一 Status欄位,顯示目前連結狀況。引用元件除Microsoft Winsock Control 6.0控制元件外,還增加了一個 Timer作為連線實際時之用。表 4為 Server端範例程式所引用的基本控制元件與其屬性值,注意對應前述 4個欄位的 4個 TextBox設定值分別為“ServerIP”、“ServerPort”、“Msg”、和“debug_info”,Command_button的設定為“Update_button”。此外Winsock命名為WskServer,採用之 Protocal為 0-sckTCPProtocol,Timer則命名為 Timer1。

圖 10. Server端範例程式外觀

Page 16: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 16

表 4. TCP_Server表單之元件與屬性

元件 屬性 設定值 Name frmServer

Form Caption TCP_Server

Frame Name Frame1 Name Label1

Label Caption Local_IP Name Label2

Label Caption Port Name Label3

Label Caption Status : Name Label4

Label Caption Msg Name ServerStatus

Label Caption Server is Idle Name debug_info

TextBox Text

Name Msg TextBox

Text Name ServerIP

TextBox Text 192.11.79.158

Name ServerPort TextBox

Text 83 Name Update_button

CommandButton Caption Update Name Timer1

Timer Enable True Name WskServer

Winsock Protocol 0-sckTCPProtocol

圖 11 為 TCP_Client 之程式碼。首先顯示 Server 端的 IP 位址,並呼叫WskServer_Listen()副程式。

在 WskServer_Listen()副程式裡,關閉 Timer1,使用 Close 方法關閉連線,設定Winsock的 LocalPort屬性為 ServerPort文字框裡的 IP位址,再使用 Listen方法等待Client端之連線請求,ServerStatus顯示“Listening ...”。

Page 17: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 17

當 Client 提出連線需求時,引發 Winsock 的 ConnectionRequest事件,開始判斷Winsock的 State為何。如果 State為 sckConnected,表示 Server已被其他 Client連結,出現提示框,內容為“Server already connected!”,如果不是,先使用 Close方法關閉連線,再使用Accept方法取得Client端的 ID,ServerStatus顯示“connected”,啟動 Timer1,設定 Timer1的週期為 10000ms,清空 debug_info文字框。

Timer1開始計時 10000ms後,呼叫WskServer_Listen()副程式,回復到等待連線(listen)狀態。

當 Client傳送資料過來時,引發Winsock的 DataArrival事件,定義 strData為一字串變數,使用 GetData接收此 strData資料,並將資料顯示在 Msg文字框裡,,同時將收到時間、訊息長度、收到訊息次數顯示在 debug_info文字框中。接著再將收到通知、收到時間、Client 端位址、Port 等相關資訊使用 SendData 方法回傳至 Client端。

當使用者按下 Update按鈕時,清空Msg文字框內容,清空 debug_info文字框內容,呼叫WskServer_Listen()副程式,回復到等待連線(listen)狀態。

Page 18: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 18

圖 11. TCP_Server程式碼

3.3 TCP程式測試

啟動資料夾 C:\YZ_PIC\Samples\pic_SERVER\VB\TCP_UDP裡的 TCP_Client.exe與TCP_Server.exe範例程式執行檔,在同一部電腦(IP:140.138.*.*)中進行測試,圖12(a)

Page 19: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 19

為執行結果,TCP_Client 端的 Status 顯示“Not Connected”,TCP_Server 端的 Status顯示“Listening…”。如圖 12(b),當 Client端設定 Server端的 IP位址與 Port,按下 Send按鈕,將Msg文字框裡的內容傳送到 Server端。

TCP_Server執行時,會讀取 Server端的 IP位址,顯示在 Local_IP文字框,Port設定為 83,TCP_Server接收到 TCP_Client傳來的資料,並將資料顯示在Msg文字框內,再自動回傳資料給 TCP_Client,在 TCP_Server,按下 Updata按鈕可清空Msg文字框與 debug_info文字框內容。TCP_Server每接收到一次資料時,msg_count便會累計加 1。圖 12(c)為 TCP_Client端所欲連結的 IP位址與 TCP_Server端不同時,經過 3秒後所出現的訊息提示框。

圖 12(a). 啟動 TCP_Client.exe與 TCP_Server.exe範例程式執行檔

Page 20: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 20

圖 12(b). TCP_Client與 TCP_Server傳送與接收過程

圖 12(c). 無法連結時出現提示框

4. 使用 TCP與 PIC_SERVER傳遞訊息

在 client端或 Server端以 PIC_SERVER取代 PC,使用 UDP或 TCP傳遞訊息,需 要 使 用 資 料 夾 C:\YZ_PIC\Samples\pic_SERVER\Beginner\ 中 的 範 例 程 式

Page 21: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 21

ex_4_udp_client.c、ex_5_udp_server.c、ex_6_tcp_server.c、及 ex_8_tcp_client.c取代前述 VB 程式。以下敘述以 PIC_SERVER 為 Server 端、PC 為 client 端,使用 TCP 與PIC_SERVER傳遞訊息的設定方式。

將範例程式 C:\YZ_PIC\Samples\pic_SERVER\Beginner\ex_6_tcp_server.c 載入PIC_SERVER,在 ICP中設定 local TCP server port的欄位(例如 3423),不可與 HTTP port相同(例如 80),如圖 13所示。

Client端的 PC則仍執行前述 VB程式 TCPclient.exe,將其 Host_IP與 Port設定為 pic_SERVER的 IP和 local TCP server port,就可以傳訊給 PIC了。例如在Msg文字框裡輸入字串訊息“I am superman”,按下 Send按鈕傳遞,PIC_SERVER接收到訊息後再回傳通知給 TCP_Client,如圖 14。

範例程式 ex_6_tcp_server.c架構和先前教材中 PIC端 C程式十分類似,且範例程式中有很清楚的註解說明,此處不再一一詳加解釋。值得注意的是範例程式

ex_6_tcp_server.c 中 TCP 通訊部分,主要差異在先前沒有用到的 call back 函式callback_TCPclientDataArrival()內,即接獲 TCP client傳來 data後的處理動作,這個callback副程式與 VB範例 TCP_Server.vbp裡面的副程式

Private Sub WskServer_DataArrival(ByVal bytesTotal As Long)

的功能與角色完全相同,只是命名的概念有些差異罷了。此外,VB 用

WskServer.GetData strData以及WskServer.SendData (reply_msg)等兩個指令實現接收字串與傳送字串的功能,pic_SERVER則使用 BIOS指令 nic_getc與 nic_putc這兩個指令實現接收一個字元(byte)與傳送一個字元的功能,用 printf( nic_putc, ⋯)的方式實現傳送字串的功能。總之,要做的事情都一樣,不同的程式語言採用不同的指令與函

數實現這些功能。其他的 call back 函式如 callback_TCPserverDataArrival()、callback_UDPserverDataArrival()、callback_UDPclientDataArrival()也都可以在 VB範例中找到相對應的副程式,VB有的通訊功能PIC_SERVER也都有,瞭解VB的UDP/TCP就更能瞭解 PIC_SERVER了。

Page 22: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 22

圖 13. PIC_SERVER通訊協定設定

Page 23: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 23

圖 14. TCP_Client與 PIC_SERVER傳遞訊息

將 Port改為 80,並在 Msg文字框裡,輸入 GET/index.htm,PIC_SERVER收到此指令後將指定網頁內容回傳給 TCP_Client,如圖 15。

圖 15. TCP_Client傳遞指令索取網頁內容

Page 24: PIC SERVER 뇐ꟷ(9)ꅘꕈ VB 덝군 TCP/UDP ꒧뫴룴뛇뿩삳ꗎb93082/vb_winsock.pdf · PIC_SERVER 뇐ꟷ(9)ꅘꕈVB 덝군TCP/UDP ꒧뫴룴뛇뿩삳ꗎ 2 ꓨꩫ(Methods)ꅁꝙꕩ뙽땯Clientꅝꗎꓡ뫝ꅇꕄ냊ꗽ뙽ꑦ둍

PIC_SERVER教材(9)—以 VB設計 TCP/UDP之網路傳輸應用

http://GRC.yzu.edu.tw/ 24

【實驗】

嘗試以以下 6 種方式執行本教材中提到範例程式執行檔 UDP_Client.exe、UDP_Server.exe、TCP_Client.exe、TCP_Server.exe:

(1) PC對 PC,UDP通訊,只用一台 PC,自己發自己收。 (2) PC對 PC,UDP通訊,用兩台 PC,一個發一個收。 (3) PC對 PC,TCP通訊,只用一台 PC,自己發自己收。 (4) PC對 PC,TCP通訊,用兩台 PC,一個發一個收。 (5) 稍微修改 VB範例程式,用三台 PC互相通訊,第一台 PC用 TCP_client發信給第二台 PC的 TCP_server,第二台 PC收到第一台 PC送來的信之後,就用UDP把信轉寄給第三台 PC。當然,這個實驗用兩台 PC也可以玩。

(6) PC對 PIC_SERVER,使用 UDP與 TCP兩種模式傳送訊息,並在下週課堂上實際展示。

參考資料

黃嘉輝,2002,Visual Basic網際網路程式設計-TCP/IP與 Internet Programming篇最新版,文魁資訊股份有限公司。