﻿# 練習開發 Socket 網路應用程式最佳套件：簡單 TCP/IP 服務

[簡單 TCP/IP 服務](http://technet.microsoft.com/zh-tw/library/cc725973\(WS.10\).aspx)是一個非常古老的 Windows 服務，打從 Windows NT Server 3.51 開始就有了，它提供了一組非常簡單的網路服務，其中包括了字元產生器 ([CHARGEN](http://www.faqs.org/rfcs/rfc864.html))、日期時間服務 ([Daytime](http://www.faqs.org/rfcs/rfc867.html))、丟棄服務 ([Discard](http://www.faqs.org/rfcs/rfc863.html))、回應服務 ([Echo](http://www.faqs.org/rfcs/rfc862.html))、每日一句 ([QUOTE](http://www.faqs.org/rfcs/rfc865.html)) 等，而它所提供的網路服務都有定義在 [RFC](http://www.faqs.org/rfcs/) 網路通訊協定標準裡，最主要的目的就是用來測試網路功能是否正常，但真正使用到這些服務的人應該非常少，由於最近正在實驗 Windows Phone 7.5 (Mango) 的 Socket 功能，才發現這服務真的太好用了。

首先，我們先設法把該服務裝起來，如果你是用 Windows 7 的話，可以參照以下圖示進行安裝：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/6fa4516c03b772efd4cf-SNAGHTML30bad50a.png)

安裝好之後，當然也要先啟動服務才能開始使用：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/3bad6047bc7f2b944926-image_1251.png)

接下來我就逐一介紹各網路通訊協定的測試方式，以及每個不同協定的特性：

**回應服務 (**[**Echo**](http://www.faqs.org/rfcs/rfc862.html)**)**

-   網路埠號

-   Port **7**

-   主要特性

-   用戶端透過 Socket 傳送任何字串到該服務，該服務會立刻回應與用戶端輸入字串一模一樣的內容到用戶端

-   斷線時機

-   用戶端主動發出斷線要求

-   適用情境

-   可用來測試網路是否正常連線，也可用來監控網路是否斷線。
-   開發 Socket 應用程式時，可用來測試用戶端與伺服器端彼此互動的情況

-   測試方法

-   透過 telnet 工具程式連上本機的 Port 7 （注意：Windows 7 預設沒有安裝 **Telnet** 工具）  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/3f9ec49c6b4d2036dae6-SNAGHTML30e97c22.png)
-   連上之後會看見整個螢幕都是黑漆漆的一片，這時如果你輸入 **123** 這三個字元，螢幕上會輸出 12233 字串，接著你輸入的每一個字元，伺服器都會立刻回應你所輸入的字，例如你再輸入 0 這個字串，則會看見兩個 0 出現，一個 0 是你從 Telnet 用戶端發送到伺服器端的字元，另一個 0 時從伺服器端回傳回來的字元，而這就是 **回應服務 (**[**Echo**](http://www.faqs.org/rfcs/rfc862.html)**)** 的主要功能。  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/02a6716f3ae5067a63a3-SNAGHTML30f2e782.png)
-   各位有沒有發現，為什麼我們輸入 123，但看到的第一個字元卻是一個「空白字元」呢？難道是 **回應服務 (**[**Echo**](http://www.faqs.org/rfcs/rfc862.html)**)** 有 Bug 嗎？ 不是的！這是因為 Windows 作業系統的 Telnet 用戶端預設是關閉「**本機回應**」的，該程式必須等到伺服器回應第一個字元後才會啟動本機回應功能，如果要我們輸入第一個字元就啟動「**本機回應**」的話，必須按照以下步驟操作：  
      
    先按下 **Ctrl + \]** 快速鍵，再輸入 **set localecho** 後按下 Enter 鍵，當看見「**本機回應啟動**」後再按一次 Enter 鍵回到原本的畫面。  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/834f859c38643482a9fd-SNAGHTML30eae2c1.png)  
      
    這時你輸入的第一個字元就會看的見了：  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4cebc7508d065a7b322a-SNAGHTML30f66d34.png)

**丟棄服務 (**[**Discard**](http://www.faqs.org/rfcs/rfc863.html)**)**

-   網路埠號

-   Port **9**

-   主要特性

-   用戶端透過 Socket 傳送任何字串到該服務，該服務會立刻丟棄所接收到的任何字串

-   適用情境

-   可用來測試網路用戶端是否能夠正常透過 Socket 傳送資料
-   你可以從用戶端大量的傳送資料，直到用戶端主動斷線為止
-   開發 Socket 應用程式時，可用來測試用戶端到伺服器端之間的「上傳」頻寬大小

-   斷線時機

-   用戶端主動發出斷線要求

-   測試方法

-   透過 telnet 工具程式連上本機的 Port 9  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/492cadb33df5de24a10b-SNAGHTML30fbbcf9.png)
-   這時你亂打字在上面，怎樣都會看不到字，那是因為 Telnet 預設「本機回應」是關閉的，而且由於伺服器端永遠不會回傳訊息，所以你不開啟本機回應的話，永遠看不到任何字元。  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/01c527c3b8312775e815-SNAGHTML30fb24ef.png)

**日期時間服務 ([Daytime](http://www.faqs.org/rfcs/rfc867.html)**[](http://www.faqs.org/rfcs/rfc863.html)**)**

-   網路埠號

-   Port **13**

-   主要特性

-   用戶端透過 Socket 建立連線到該服務，該服務會立刻回應伺服器上的目前時間，回應完畢後立即斷線

-   適用情境

-   可用來取得伺服器上目前的日期時間
-   開發 Socket 應用程式時，可用來取得伺服器時間，或測試伺服器端主動發出斷線的狀況

-   斷線時機

-   伺服器端主動發出斷線要求

-   測試方法

-   透過 telnet 工具程式連上本機的 Port 13
-   當看見伺服器回應的日期時間字串後會立即斷線  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e37926fb714314084014-SNAGHTML310645a8.png)

**每日一句 (**[**QUOTE**](http://www.faqs.org/rfcs/rfc865.html)**)**

-   網路埠號

-   Port **17**

-   主要特性

-   用戶端透過 Socket 建立連線到該服務，該服務會立刻回應**一段話** (通常是一句名人說過的話)，回應完畢後立即斷線
-   這一句話，可能為一行或多行文字，但規定不得大於 512 位元組

-   適用情境

-   開發 Socket 應用程式時，可用來取得不固定大小的文字，或測試伺服器端主動發出斷線的狀況

-   斷線時機

-   伺服器端主動發出斷線要求

-   測試方法

-   透過 telnet 工具程式連上本機的 Port 17
-   當看見伺服器回應的字串後會立即斷  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e3eeb1f6246cc803ee2b-SNAGHTML31109020.png)

**字元產生器 (**[**CHARGEN**](http://www.faqs.org/rfcs/rfc864.html)**) (Character Generator)**

-   網路埠號

-   Port **19**

-   主要特性

-   用戶端透過 Socket 建立連線到該服務，該服務會立刻回應永無止境的 ASCII 字元，直到用戶端主動發出斷線請求

-   適用情境

-   開發 Socket 應用程式時，可用來測試用戶端到伺服器端之間的「下載」頻寬大小，以及利用 Buffer 儲存大量文字的情境

-   斷線時機

-   用戶端主動發出斷線要求

-   測試方法

-   透過 telnet 工具程式連上本機的 Port 19
-   接著命令提示字元就會跑一段動畫（呵～其實不是動畫，而是一大堆字元被列印在螢幕上）  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/95522805ca37d9b3c8ff-SNAGHTML31142ae8.png)
-   如果要從 Telnet 應用程式跳離，可以先按下 **Ctrl + \]** 快速鍵，再輸入 **quit** 後按下 Enter 鍵即可跳出  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f5e78baf1cc2d08384ff-SNAGHTML3115533f.png)

有了這五個真的很簡單的網路服務，在練習開發 Winsock 或一般 Socket 應用程式用戶端時，就不用先費心開發一個測試的伺服器端的網路服務或通訊協定，如此一來，你甚至還能直接開發用戶端測試各種遠端伺服器可能發生的各種狀況，如上文章所述。

**相關連結**

-   [簡單 TCP/IP 服務概觀](http://technet.microsoft.com/zh-tw/library/cc725973\(WS.10\).aspx)
-   How To Use NT Simple TCP/IP Services for Winsock Testing
-   [RFC 862 - Echo Protocol](http://www.faqs.org/rfcs/rfc862.html)
-   [RFC 863 - Discard Protocol](http://www.faqs.org/rfcs/rfc863.html)
-   [RFC 864 - Character Generator Protocol](http://www.faqs.org/rfcs/rfc864.html)
-   [RFC 865 - Quote of the Day Protocol](http://www.faqs.org/rfcs/rfc865.html)
-   [RFC 867 - Daytime Protocol](http://www.faqs.org/rfcs/rfc867.html)
-   Windows Server Simple TCP/IP Services
