34
3-1 3 Socket 3-1 Berkeley Socket 3-2 Java Socket 3-3 Microsoft Windows Socket API 3-4 Microsoft WinSock Control 3-5 Microsoft .NET Framework

Socket - Gotop

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Socket - Gotop

3-1

3Socket

3-1 Berkeley Socket

3-2 Java Socket

3-3 Microsoft Windows Socket API

3-4 Microsoft WinSock Control

3-5 Microsoft .NET Framework

Page 2: Socket - Gotop

3-2

本書旨在介紹如何運用Microsoft C# 2008開發網路應用程式,其中尤以 Socket為

網路應用之核心,因此有必要介紹 Socket為何,並比較不同作業系統或應用程

式類型之 Socket間的差異,包括 BSD(Berkeley Socket Distribution)、Java類別、

Microsoft WinSock API、Microsoft WinSock Control及Microsoft .NET Framework所提

供之類別。另外也介紹 Socket網路應用程式的主要架構,以作為後續章節中各類

型的伺服端與用戶端應用程式之基礎。

3-1 Berkeley Socket

在前一章中,筆者介紹 OSI七層架構及 TCP/IP的網路架構,由於早期網路硬體的

規格通常沒有一定的標準,因此開發網路應用程式必須針對不同的網路硬體規格

撰寫,相對地其難度亦較高,也較不經濟。是否有一應用程式介面是介於應用程式

與硬體之間,並提供標準的函式以符合不同的網路硬體規格呢?這個應用程式介

面就是 Socket Interface。

最早的 Socket Interface是於 1980年代,由加州柏克萊大學為支援 UNIX作業系統

上的 TCP/IP應用所開發的 Socket介面,稱為 Berkeley Socket Interface,而其軟體則

稱為 Berkeley Software Distribution,簡稱 BSD。

Berkeley Socket Interface是一組介面函式,介於網路應用程式與作業系統及網路硬

體之間,提供標準的函式,應用程式透過呼叫 Socket Interface,以發展具備有 TCP/

IP網路功能之應用。

Page 3: Socket - Gotop

3-3

3Socket

下表為 Berkeley Socket所提供有關支援伺服端與用戶端網路應用程式之 API函式:

BSD Socket 說明

伺服端

socket 建立 Socket。bind 設定 Socket所使用的 local端 IP 位址及通訊埠。listen 設定 Socket等候 (listen)用戶端連結請求。accept 接受來自用戶端的連結請求,並且建立 Socket連結。recvread

(TCP)接收來自用戶端所傳送的資料。

recvfrom (UDP)接收來自用戶端所傳送的資料。sendwrite

(TCP)傳送資料至用戶端。

sendto (UDP)傳送資料至用戶端。closesocket 關閉通訊連結及 Socket,並且釋放系統資源。shutdown 關閉 Socket的傳送及接收功能。

用戶端

socket 建立 Socket。connect 建立與伺服端 Socket連線。recvread

(TCP)接收來自伺服端所傳送的資料。

recvfrom (UDP)接收來自伺服端所傳送的資料。sendwrite

(TCP)傳送資料至伺服端。

sendto (UDP)傳送資料至伺服端。closesocket 關閉通訊連結及 Socket,並且釋放系統資源。shutdown 關閉 Socket的傳送及接收功能。

Berkeley Socket在網路應用程式開發上,大致有下列兩大類:(1)Stream Socket;

(2)Datagram Socket。

Stream Socket ►

使用 TCP(Transmission Control Protocol傳輸控制協定)傳送資料。除了提供無

錯誤資料傳輸之外,並提供偵錯、復原及排序資料的功能,因此 Stream Socket

應用程式可保證資料無誤送達,且到順序與送出順序相同。

Page 4: Socket - Gotop

3-4

Stream Socket在伺服端的開發流程: ►

在伺服端程式中,BSD Socket首先以 socket建立伺服端之 Socket,並以 bind

設定 Socket所使用的伺服端 IP位址及通訊埠,待伺服端 Socket建立之後,則

以 listen表示伺服端應用程式開始等待用戶端之連線,當接收到來自用戶端

的連線請求時,便以 accept建立與用戶端的連線。

在傳遞資料上,伺服端與用戶端之間,可透過 read、recv及 send、write進行

資料的接收及傳送,當連線中斷時,程式利用 closesocket關閉 Socket並釋於

系統資源。

Stream Socket在用戶端的開發流程: ►

Page 5: Socket - Gotop

3-5

3Socket

就用戶端應用程式而言,首先以 socket建立用戶端之 Socket,其主要目的是與

指定的伺服端(需指定主機的 IP位址及通訊埠)建立連線,此一動作由 connect

來完成。當伺服端收到 connect的請求連線時,則由伺服端的 accept建立此連線。

接著的流程則與伺服端一樣,可利用 read、recv及 send、write接收及傳送資

料。最後並以 closesocket關閉 Socket連線。

可以看出,伺服端與用戶端的 Stream Socket應用程式,除了開始的不同之外

(前者以 listen及 accept,後者以 connect),其餘流程則相同。

Datagram Socket ►

使用 UDP傳送資料。常用於傳遞少量資料上,所以 UDP只保證資料一定會被

送出,但不保證資料會被收到,並且若發生錯誤,並不進行重送的動作,屬於

單向的傳送類型(Connectionless Protocol)。

Datagram Socket應用程式: ►

Datagram Socket與 Stream Socket最大的不同點在於,Stream Socket在傳遞資料

之前必須在伺服端與用戶端之間先建立連線,因此有相當的主從關係存在。

但 Datagram Socket則不然,並不需要先建立連線,因此傳遞資料的雙方並無

實際的連線關係存在,為 Connectionless Protocol,而資料只管被一方送出,被

另一方接收而已,因此並無真正的主從關係存在,Datagram Stream的應用程式

只有一種方式,其流程如下:

Page 6: Socket - Gotop

3-6

由於不必建立雙方的連線關係,因此只需利用 sendto及 recvfrom傳送及接收資

料,最後仍利用 closesocket關閉 Socket並釋放系統資源。

3-2 Java Socket

Java最初設計的目的有下列幾項考量:

與作業系統及平臺無關之程式語言。 ●

物件導向語言。 ●

改進 HTML僅能顯示靜態內容之缺點。 ●

增強WWW與使用者互動的模式。 ●

制定 Internet標準語言,由於在 Java之前,HTML語言概有Microsoft、Netscape ●

等公司分別制定的 HTML標籤,最後的結果則是沒有標準可言。

支援 Internet網際網路。 ●

基於以上考量,Java初期則將支援網路視為必備之要素,在擷取 Berkeley Socket的

優點,並加入 Java跨平臺、物件導向、支援 Internet網際網路等考量之下,Java一

推出則包括有關 Socket API套件-java.net。

發展至今,Java支援網路的 API共有:

java.net ● :Networking。javax.net.ssl ● :Networking with Secure Socket Layer(SSL)。java.rmi ● :Remote Method Invocation。javax.rmi ● :Remote Method Invocation for IIOP。java.nio.channels.ServerSocketChannel ● :New I/O Server Socket Channel。java.nio.channels.SocketChannel ● :New I/O Client Socket Channel。

以 java.net而言,其 API概分別處理:(1)主機名稱及 IP位址;(2)URL;(3)TCP

通訊協定;(4)UDP通訊協定;(5)網路認證(Authentication)及權限(Permission);

(6)內容處理器(Content Handler)。

1. 主機名稱及 IP位址:在 java.net中,處理主機名稱及 IP位址的類別及方法有:

Page 7: Socket - Gotop

3-7

3Socket

類別:

java.net.Inet4Address ●

java.net.Inet6Address ●

java.net.InetAddress ●

java.net.InetSocketAddress ●

java.net.SocketAddress ●

例外錯誤:

java.net.UnknownHostException ●

2. 處理 URL:在 java.net中,與 URL有關的類別有:

介面:

java.net.URLStreamHandlerFactory ●

類別:

java.net.HttpURLConnection ●

java.net.JarURLConnection ●

java.net.URI ●

java.net.URL ●

java.net.URLClassLoader ●

java.net.URLConnection ●

java.net.URLDecoder ●

java.net.URLEncoder ●

java.net.URLStreamHandler ●

例外錯誤:

java.net.MalformedURLException ●

java.net.UnknownServiceException ●

3. 處理 TCP通訊協定:

介面:

java.net.SocketImplFactory ●

java.net.SocketOptions ●

Page 8: Socket - Gotop

3-8

類別:

java.net.NetworkInterface ●

java.net.ServerSocket ●

java.net.Socket ●

java.net.SocketImpl ●

例外錯誤:

java.net.BindException ●

java.net.ConnectException ●

java.net.NoRouteToHostException ●

java.net.ProtocolException ●

java.net.SocketException ●

4. 處理 UDP通訊協定:

介面:

java.net.DatagramSocketImplFactory ●

類別:

java.net.DatagramPacket ●

java.net.DatagramSocket ●

java.net.DatagramSocketImpl ●

java.net.MulticastSocket ●

例外錯誤:

java.net.SocketException ●

5. 處理 Proxy伺服器連線:

類別:

java.net.Proxy ●

java.net.ProxySelector ●

Page 9: Socket - Gotop

3-9

3Socket

6. 處理網路認證(Authentication)及權限(Permission):

類別:

java.net.Authenticator ●

java.net.NetPermission ●

java.net.PasswordAuthentication ●

java.net.SocketPermission ●

java.net.SocketException ●

7. 內容處理器(Content Handler):

介面:

java.net.ContentHandlerFactory ●

類別:

java.net.ContentHandler ●

java.net.SocketException ●

java.net有關支援 Stream Socket伺服端與用戶端網路應用程式的相關 API:

Java API 說明

伺服端

java.net.ServerSocket 建立伺服端 Socket及設定所使用的 IP位址及通訊埠。

accept 等候及接受來自用戶端的連結請求,並且建立與用戶端之連結。

read 接收來自用戶端所傳送的資料。

write 傳送資料至用戶端。

close 關閉 Socket及與用戶端之通訊連結。

用戶端

java.net.Socket 建立用戶端 Socket,並且嘗試建立與伺服端之連結。

read 接收來自伺服端所傳送的資料。

write 傳送資料至伺服端。

close 關閉 Socket及與伺服端之通訊連結。

Page 10: Socket - Gotop

3-10

下圖為 Java在 Stream Socket伺服端與用戶端的架構圖:

另外,java.net在支援 Datagram Socket應用程式之 API:

Java API 說明

DatagramSocket 建立 Datagram Socket。DatagramPacket 建立 Datagram Packet。(DatagramSocket) receive 接收 Datagram Packet。(DatagramSocket) send 傳送 Datagram Packet。close 關閉 Datagram Socket。

下圖為 Java Datagram Socket(UDP)之架構圖:

Page 11: Socket - Gotop

3-11

3Socket

3-3 Microsoft Windows Socket API

Microsoft Windows Socket API(簡稱WinSock API),是Microsoft以 Berkeley Socket

Distribution API為基礎所發展出來的。

在Microsoft Windows 3.1(含)之前,Windows並不包含支援 TCP/IP的 Socket API,

因此在網路功能上相對地不足。而支援網路功能則由 Third-Party協力廠商開發,較

有名的有 Trumpet WinSock、Chameleon、NetWare等,支援 TCP/IP的 Socket API應

用函式庫,雖然這些產品都是以 Berkeley Socket Distribution API為基礎所發展出來

的,但各家廠商畢竟仍各有差異,因此在Windows 3.1上開發的網路應用程式並不

多見,更別說是一般使用者沒有標準的Windows API可供使用。

Microsoft為了解決此一問題,便與協力廠商共同開發可供Microsoft Windows使用

的標準 Socket API,稱之為Microsoft Windows Socket API或WinSock API。Microsoft

WinSock API是以 Berkeley Socket Distribution API為基礎所開發出來的,但由於需

要能在Microsoft Windows環境上執行,因此Microsoft WinSock API主要可分成四

大部份,其中一部份是依照 Berkeley Socket API的 BSD Socket,另一部份則是依照

Microsoft Windows環境所發展出來的延伸函數。

由於各個廠商所開發出來的 TCP/IP應用程式或硬體不同,因此Microsoft WinSock

API就扮演著之間橋樑,提供標準的 API介面於應用程式與 TCP/IP及硬體之間。

Page 12: Socket - Gotop

3-12

隨著Microsoft Windows版本不斷更新(95→ 95A→ 95B→ 98→ 98SE→ 2000→ XP),

Microsoft WinSock API的版本及檔案名稱也不斷的更換,由WinSock.dll、WSock32.dll

到WS2_32.dll,版本則由 1.0、1.1至 2.0版,下圖為WinSock API各版本之間的相容性。

WinSock API共可分為四大類,分別為:(1)BSD Socket API;(2)WinSock延伸

(Extended)函數;(3)轉換(Conversion)函數;(4)資料庫(Database)函數。

1. BSD Socket API:以與 UNIX或其它 OS上的標準 BSD Socket API為基礎所發展

出來的,這部分在WinSock 2.0已漸漸被WinSock延伸函數所取代。其主要功能

在於建立 Socket連線、傳送或接收數資料、與主機建立連線等。

BSD Socket API 說明

accept 讓 listening的 Socket接受來自 remote端的連結請求,並且建立 Socket連結。

bind 設定 Socket所使用的 local端 IP位址及通訊埠。closesocket 關閉通訊連結及 Socket,並且釋放系統資源。connect 建立 Socket之間的連線。getpeername 回傳 Socket所連結的 remote端 IP位址及通訊埠。getsockname 回傳 Socket所使用的 local端 IP位址及通訊埠。getsockopt 回傳 Socket的選項值。ioctlsocket 設定或回傳 Socket參數值。listen 設定 Socket等候連結請求。

Page 13: Socket - Gotop

3-13

3Socket

BSD Socket API 說明

recv 接收來自另一 Socket所傳送的資料。recvfrom 接收來自另一 Socket所傳送的資料並且回傳此 Socket

資訊。

select 設定 Socket的讀、寫狀態並且執行同步(Synchronous)的 I/O傳輸。

send 傳送資料至另一 Socket。sendto 傳送資料至指定 IP位址及通訊埠。setsockopt 設定 Socket的選項值。shutdown 關閉 Socket的傳送及接收功能。socket 建立 Socket。

2. WinSock延伸函數:Microsoft因應 Windows多工、事件導向與訊息導向的

環境,以 BSD Socket API為基礎而發展出的WinSock API函數,提供了 BSD

Socket API所沒有的非同步(Asynchronous)及訊息導向的 Socket API,此類

函數通稱為WinSock延伸函數,為了區別起見,WinSock延伸函數均以 WSA開

頭。大部分的WinSock延伸函數的功能與 BSD Socket API差不多,也很容易聯

想在一起,例如 BSD Socket API的 connect代表建立 Socket間的連線,則相對

應的WinSock延伸函數則是 WSAConnect,同樣提供相同的功能。WinSock的延伸

函數分別為:

WinSockExtended API

BSDSocket API 說明

WSAAccept accept accept的延伸WinSock API。讓 listening的伺服端 Socket接受來自remote Socket的連結請求,並且建立Socket連結。

WSASelect select select的延伸WinSock API。設定 Socket的讀、寫狀態的 I/O傳輸。

WSAConnect connect connect的延伸WinSock API。建立 Socket之間的連線。

WSARecv recv recv的延伸WinSock API。接收來自另一 Socket所傳送的資料。

WSARecvFrom recvfrom recvfrom的延伸WinSock API。接收來自另一 Socket所傳送的資料並且回傳此 Socket資訊。

Page 14: Socket - Gotop

3-14

WinSockExtended API

BSDSocket API 說明

WSASend send send的延伸WinSock API。傳送資料至另一 Socket。

WSASendTo sendto sendto的延伸WinSock API。傳送資料至指定 IP位址及通訊埠。

WSASocket socket socket的延伸WinSock API。建立 Socket。

與Microsoft Windows事件有關的WinSock API有:

WinSock Extended API 說明

WSACloseEvent 關閉WinSock事件。WSACreateEvent 建立WinSock事件。WSAEnumNetworkEvents 回傳目前所有的WinSock事件。WSAResetEvent 更新WinSock事件。WSASetEvent 設定WinSock事件。WSAWaitForMultipleEvents 等待正在阻斷(Blocking)的WinSock事件。

WinSock新增的 Socket API有:

WinSock Extended API 說明

WSACleanup 釋放所使用的WinSock。WSADuplicateSocket 建立虛擬的 Socket。WSAEnumProtocols 回傳所有的通訊協定之資訊。

WSAGetLastError 回傳Windows所產生的最新的WinSock錯誤代碼。

WSASetLastError 設定WinSock錯誤代碼。WSAStartup 建立 Socket。

3. 轉換函數:此類函數主要用來將 32 bit或 16 bit(位元)的整數從主機位元順序

(Host Byte Order)轉換為網路位元順序(Network Byte Order),或者是由網路

位元順序轉為主機位元順序。另外,也提供 32位元 IP位址與 ASCII位址之間

的轉換。轉換函數也分成 BSD與Windows延伸 API兩種,其比較如下:

Page 15: Socket - Gotop

3-15

3Socket

WinSockExtended API

BSDSocket API 說明

WSAHtonl htonl 將 32位元長整數從主機位元順序轉換至網路位元順序。

WSAHtons htons 將 16位元短整數從主機位元順序轉換至網路位元順序。

WSANtohl ntohl 將 32位元長整數從網路位元順序轉換至主機位元順序。

WSANtohs ntohs 將 16位元短整數從網路位元順序轉換至主機位元順序。

inet_addr 將 IP位址字串轉換為 32位元 IP位址。inet_ntoa 將 32位元 IP位址轉換為 IP位址字串。

4. 資料庫函數:雖名為資料庫函數,但與資料庫並無關聯。主要在處理 IP位址與

主機名稱間的轉換、或者是取得通訊協定或通訊埠等相關資訊。

BSD Socket API 說明

gethostbyaddr 以主機 IP位址取得主機的相關資訊。gethostbyname 以主機名稱取得主機的相關資訊。

gethostname 取得 local主機名稱。getprotobyname 以通訊協定的名稱取得通訊協定的相關資訊。

getprotobynumber 以通訊協定的號碼取得通訊協定的相關資訊。

getservbyname 以服務的名稱及通訊協定取得服務的相關資訊。如 FTP、 HTTP、HTTPS。

getservbyport 以服務的通訊埠及通訊協定取得服務的相關資訊。如 FTP、 HTTP、HTTPS。

WinSock Extended API 說明

WSAAsyncGetHostByAddr gethostbyaddr的延伸WinSock API。以主機 IP位址執行非同步取得主機的相關資訊。

WSAAsyncGetHostByName gethostbyname的延伸WinSock API。以主機名稱執行非同步取得主機的相關資訊。

WSAAsyncGetProtoByName getprotobyname的延伸WinSock API。以通訊協定的名稱執行非同步取得通訊協定的相關資訊。

Page 16: Socket - Gotop

3-16

WinSock Extended API 說明

WSAAsyncGetProtoByNumber getprotobynumber的延伸WinSock API。以通訊協定的號碼執行非同步取得通訊協定的相關資訊。

WSAAsyncGetServByName getservbyname的延伸WinSock API。以服務的名稱及通訊協定執行非同步取得服務的相關資訊。如 FTP、 HTTP、HTTPS。

WSAAsyncGetServByPort getservbyport的延伸WinSock API。以服務的通訊埠及通訊協定執行非同步取得服務的相關資訊。如 FTP、 HTTP、HTTPS。

WinSock在應用程式發展上可分為兩類:(1)Stream Socket;(2)Datagram Socket。

WinSock Stream Socket Client/Server ►

Microsoft WinSock在處理伺服端程式時,首先以 WSAStartup建立伺服端之

Socket,並以 bind設定 Socket所使用的伺服端 IP位址及通訊埠,待伺服端

Socket建立之後,則以 listen表示伺服端應用程式開始等待用戶端之連線,當

接收到來自用戶端的連線請求時,便以 WSAAccept建立與用戶端的連線。在傳

遞資料上,伺服端與用戶端之間,可透過 WSARecv及 WSASend接收及傳送資料。

最後則以 WSACleanup關閉伺服端 Socket。

Page 17: Socket - Gotop

3-17

3Socket

就用戶端應用程式而言,Microsoft WinSock主要是與伺服端(需指定主機的

IP位址及通訊埠)建立連線,此一動作由 WSAConnect來完成。當伺服端收到

WSAConnect的請求連線時,則由伺服端的 WSAAccept建立此連線。接著可利用

WSARecv及 WSASend接收及傳送資料。最後並以 WSACleanup關閉 Socket連線。

WinSock Datagram Socket ►

Datagram Socket並不需要事先建立連線,因此傳遞資料的雙方並無實際的連線

關係存在,為 Connectionless Protocol,而資料只管被一方送出,被另一方接收

而已,因此並無真正的主從關係存在。由於不必建立雙方的連線關係,因此只

需利用 WSARecvFrom及 WSASendTo接收及傳送資料。最後仍利用 WSACleanup關閉

Socket並釋放系統資源。

3-4 Microsoft WinSock Control

Microsoft WinSock Control 6.0控制元件為Microsoft Visual Basic 6.0所附之控制元件,

在前一章中所介紹的 OSI Model,每層皆有其相對應的軟體或通訊協定支援各層的

網路功能,而Microsoft WinSock Control 6.0控制元件則是應用程式與 UDP或 TCP

通訊協定之間的橋樑。

Microsoft WinSock Control 6.0提供以下之屬性、事件及方法:

Page 18: Socket - Gotop

3-18

屬性

BytesReceived、Index、LocalHostName、LocalIP、LocalPort、Name、Object、Parent、Protocol、RemoteHost、RemoteHostIP、RemotePort、SocketHandle、State、Tag

事件Close、Connect、ConnectionRequest、DataArrival、Error、SendComplete、SendProgress

方法 Accept、Bind、Close、GetData、Listen、SendData

以 TCP/IP應用程式為例,其執行流程大致如下: ►

1. 欲建立主從應用程式,首先伺服端必須建立可提供用戶端連結之功能,則產生

Listen以等待用戶端連結。另一方面,用戶端同時也嘗試與伺服端建立連結。

嘗試連結

2. 當伺服端接收到來自用戶端的連結請求時,將產生伺服端 Microsoft WinSock

Control控制元件的 ConnectionRequest事件,在此事件中,可利用 Accept方法接

收來自用戶端的請求。

建立連結

3. 一旦用戶端與伺服端成功地建立連結之後,用戶端則可開始對伺服端傳送

資料(SendData),同時伺服端的 Microsoft WinSock Control控制元件會產生

DataArrival事件,在此事件中,可利用 GetData方法接收自用戶端所傳送來之資

料。

Page 19: Socket - Gotop

3-19

3Socket

用戶端傳送資料至伺服端

4. 而伺服端對用戶端傳送資料,其方法與由用戶端傳送資料至伺服端一樣。

3-5 Microsoft .NET Framework

在Microsoft .NET Framework環境中,支援 TCP/IP網路應用之開發,則是 System.

Net與 System.Net.Sockets命名空間。

System.Net命名空間 ►

System.Net命名空間支援網路通訊協定,分別處理以下之網路功能:

1. 主機名稱及 IP位址:在 Internet的環境中,每一台主機均有一個或一個以上的

IP位址(位址),以確保在傳送資料時,資料會正確無誤地傳送到所指定 IP位

址的主機。IP位址為一 32位元(232)的數值,而為了方便起見,通常以 10進

位的方式來表示,並將 32位元(232)數值分為 4個位元組(則每個位元組為

28 = 256,因此 IP位址的每一位元組可由 0至 255),並且以 "."隔開,例如:

127.0.0.1。由於 IP位址通常較難記憶,為了方便起見,因此在 Internet環境

中,另外針對每台主機給予一相對的名稱,以方便操作或查尋之用,例如最常

見的例子是,127.0.0.1其相對的名稱為 localhost,因此在查詢以 127.0.0.1所建

立的網站時(假設預設 80為 http的通訊埠),可以用 "http://localhost/"來代替

"http://127.0.0.1/"。

處理主機名稱及 IP位址之命名空間為 System.Net,其類別有:

EndPoint ●

EndpointPermission ●

Page 20: Socket - Gotop

3-20

IPAddress ●

IPEndPoint ●

IPHostEntry ●

SocketAddress ●

2. DNS:Internet的主機均以 IP位址代表此主機的位址,但由於 IP位址是以

32位元數值或分為 4單位 8位元的方式表示,因此較難記憶,在 Internet環

境中,另外針對每一台主機給以一相對的名稱,以方便記憶與查詢之用,

例如常以 "localhost"名稱代表 "127.0.0.1",因此查詢以 "127.0.0.1"的網站時

(假設以 80為其 HTTP通訊協定之通訊埠),可以用 "http://localhost/"代替

"http://127.0.0.1"。此稱為 Domain Name System(DNS,網域名稱系統)。DNS

為一分散式資料庫,用以儲存 IP位址與主機名稱之對映,並將網域主機名稱轉

換成 IP位址。

處理 DNS之命名空間為 System.Net,其類別有:

Dns ●

DnsPermission ●

DnsPermissionAttribute ●

3. URL:URL全名為 Uniform Resource Locators,URL以下列之形式表示:

<通訊協定 >://<主機位址 >/<虛擬目錄 >/<資源 >?<參數 >

通訊協定:則資源的存取方式,透過何種通訊協定(Protocol)來存取資源 ●

Protocol, 如 http、https(HTTP with Secure Socket Layer)、ftp、gopher 或mail等。

主機位址:伺服器之 IP位址或 DNS名稱。 ●

虛擬目錄:以Microsoft Windows系統為例,例如設定 C:\Temp的實體目錄 ●

(Physical Directory)為Web伺服器根目錄下的 /dir虛擬目錄,則當瀏覽http://<webserver>/dir時,其實是在瀏覽 C:\Temp\目錄下的檔案。

資源:虛擬目錄下的檔案,若為 http通訊協定,可為 .htm、.html、.asp、 ●

.php、.jsp、Java Servlet等。

參數:適合於 Server Page如 Active Server Page、JavaServer Page或 CGI等 ●

需傳入之參數。

一般而言,URL字串是由 ANSI字元所組成的,如 A∼ Z、a∼ z及 0∼ 9,

Page 21: Socket - Gotop

3-21

3Socket

但也包含了一些特殊的字元,如 "空白 "(ASCII 32),"&"(ASCII 38)、"^"

(ASCII 94)等,雖然在瀏覽器上所呈現的仍是空白、&及 ^,但其實在傳送此

類含有特殊字元符號的 URL字串時,瀏覽器會將此類字元做正規化處理,以轉

換成 Escape字符,例如,在 URL位址上輸入以下的字串:

http://127.0.0.1/internet programming/

其中,internet與 programming中間含有一空白字元(ASCII 32),則其正規化處

理的結果為:

http://127.0.0.1/internet%20programming/

瀏覽器將 "空白字元 "轉換成 "%20"(16進位制),這樣的處理有一項好處,就

是避免特殊字元在識別上的錯亂。

另外,URL又可細分為:

Base URL:則 "<通訊協定 >://<主機位址 >"。 ●

Relative URL:相對 URL,則 "/<虛擬目錄 >/<資源 >?<參數 >"。 ●

URL字串除了之前所提到的 "通協協定 "、"主機位址 "、"虛擬目錄 "及 "資源

"等內容之外,另外也隱含了下列資訊:

通訊埠(Port):以 HTTP通訊協定為例,一般預設的通訊埠為 80,因此 ●

URL可寫成:

http://127.0.0.1:80/

由於 80為預設值,因此也可以省略。

使用者名稱及密碼。 ●

處理 URL之命名空間為 System,其類別有:

Uri ●

UriBuilder ●

UriBuilder ●

UriFormatException ●

UriParser ●

UriTypeConverter ●

Page 22: Socket - Gotop

3-22

4. 請求與回應:Client/Server應用的主要精神在於用戶端的請求與伺服端的回應,

在伺服端方面,大致內容為伺服端等候用戶端之連結請求,當伺服端偵測到來

自用戶端的連結請求時,則接受此用戶端請求並藉此建立用戶端之 Socket連

結,此 Socket將做為此用戶端連線及後續處理傳送及接收資料的依據,接著根

據用戶端傳來的請求,伺服端需經過程式邏輯處理之後,回傳相對應的執行結

果或錯誤訊息至用戶端;當程式完成資料或指令的處理之後,便關閉 Socket通

訊連結。而在用戶端方面,用戶端指定欲連結伺服端的 DNS主機名稱(或 IP

位址)與 Internet服務的通訊埠與伺服端建立通訊連結,當連結建立之後,接

著傳送特定資訊或指令至伺服端處理;待伺服端處理之後,則接收伺服端回傳

的執行結果或錯誤訊息,並以特定格式顯示;最後當用戶端不需伺服端的處理

時,便關閉 Socket通訊連結。Microsoft .NET Framework提供以下支援請求與回

應的類別,其中 FtpWebRequest與 FtpWebResponse類別用以處理 FTP通訊協定,

為 .NET Framework 2.0新增之類別。HttpWebRequest與 HttpWebResponse類別用以

處理 HTTP通訊協定,WebRequest與 WebResponse類別則是抽象類別,前四項類

別皆繼承自 WebRequest與 WebResponse,其命名空間為 System.Net,類別包括:

FileWebRequest ●

FileWebResponse ●

FtpWebRequest ●

FtpWebResponse ●

GlobalProxySelection ●

HttpVersion ●

HttpWebRequest ●

HttpWebResponse ●

ProtocolViolationException ●

ServicePoint ●

ServicePointManager ●

WebClient ●

WebException ●

WebHeaderCollection ●

WebProxy ●

Page 23: Socket - Gotop

3-23

3Socket

WebRequest ●

WebResponse ●

5. HTTP Cookie:Cookies是Web伺服器與客戶端的瀏覽器之間傳送資料的一種方

法。當使用者透過瀏覽器連結至網站瀏覽時,該網站可以將一些特定的資料,

例如使用者的使用名稱、登錄時間等,儲存於 Cookies中,並將 Cookies儲存於

使用者的電腦中,等到下一次該使用者再瀏覽此網站時,則可開啟此 Cookies並

取出之前所儲存之資料。處理 HTTP Cookie之命名空間為 System.Net,其類別

有:

Cookie ●

CookieCollection ●

CookieContainer ●

CookieException ●

6. 網路組態設定:網路組態設定(Configuration)是 .NET Framework 2.0新增支

援 System.Net命名空間設定組態之用,其命名空間為 System.Net.Configuration,

設定包括 FTP快取原則(FTP Cache Policy)、HTTP快取原則(HTTP Cache

Policy)、SMTP、Socket物件等之組態,其類別有:

AuthenticationModuleElement ●

AuthenticationModuleElementCollection ●

AuthenticationModulesSection ●

BypassElement ●

BypassElementCollection ●

ConnectionManagementElement ●

ConnectionManagementElementCollection ●

ConnectionManagementSection ●

DefaultProxySection ●

FtpCachePolicyElement ●

HttpCachePolicyElement ●

HttpWebRequestElement ●

Ipv6Element ●

MailSettingsSectionGroup ●

Page 24: Socket - Gotop

3-24

ModuleElement ●

NetSectionGroup ●

PerformanceCountersElement ●

ProxyElement ●

RequestCachingSection ●

ServicePointManagerElement ●

SettingsSection ●

SmtpNetworkElement ●

SmtpSection ●

SmtpSpecifiedPickupDirectoryElement ●

SocketElement ●

WebProxyScriptElement ●

WebRequestModuleElement ●

WebRequestModuleElementCollection ●

WebRequestModulesSection ●

7. 網路資訊:為 .NET Framework 2.0新增之功能,用以監控網路流量、取得網路

位址資訊、本機 IP位址變更通知、網路介面組態、TCP連線資訊、TCP統計資

料、UDP統計資料及提供支援 Ping之類別以判斷是否能透過網路存取遠端電腦

等,其命名空間為 System.Net.NetworkInformation,其類別有:

GatewayIPAddressInformation ●

GatewayIPAddressInformationCollection ●

IcmpV4Statistics ●

IcmpV6Statistics ●

IPAddressCollection ●

IPAddressInformation ●

IPAddressInformationCollection ●

IPGlobalProperties ●

IPGlobalStatistics ●

IPInterfaceProperties ●

IPv4InterfaceProperties ●

IPv4InterfaceStatistics ●

Page 25: Socket - Gotop

3-25

3Socket

IPv6InterfaceProperties ●

MulticastIPAddressInformation ●

MulticastIPAddressInformationCollection ●

NetworkAvailabilityEventArgs ●

NetworkChange ●

NetworkInformationException ●

NetworkInformationPermission ●

NetworkInformationPermissionAttribute ●

NetworkInterface ●

PhysicalAddress ●

Ping ●

PingCompletedEventArgs ●

PingOptions ●

PingReply ●

TcpConnectionInformation ●

TcpStatistics ●

UdpStatistics ●

UnicastIPAddressInformation ●

UnicastIPAddressInformationCollection ●

8. 網路認證(Authentication)及權限(Permission):

System.Net.AuthenticationManager ●

System.Net.Authorization ●

System.Net.CredentialCache ●

System.Net.NetworkCredential ●

System.Net.SocketPermission ●

System.Net.SocketPermissionAttribute ●

System.Net.WebPermission ●

System.Net.WebPermissionAttribute ●

Page 26: Socket - Gotop

3-26

System.Net.Sockets命名空間是以依據 Berkeley Socket Distribution API為基礎所開

發,與Microsoft Windows Socket API一樣,同樣支援 Stream Socket與 Datagram

Socket之網路應用程式開發,其類別有:

LingerOption ●

MulticastOption ●

NetworkStream ●

Socket ●

SocketException ●

TcpClient ●

TcpListener ●

UdpClient ●

其中 System.Net.Sockets.Socket類別與之前所介紹的Microsoft WinSock Control 6.0

及Microsoft Windows Socket API類似,支援 TCP與 UDP之網路應用程式開發,其

成員有:

1. 建構函式:

public Socket(SocketInformation socketInformation)

public Socket(AddressFamily addressFamily,

SocketType socketType, ProtocolType protocolType)

2. System.Net.Sockets.Socket之屬性:

AddressFamily ●

Available ●

Blocking ●

Connected ●

DontFragment ●

EnableBroadcast ●

ExclusiveAddressUse ●

Handle ●

IsBound ●

Page 27: Socket - Gotop

3-27

3Socket

LocalEndPoint ●

MulticastLoopback ●

NoDelay ●

OSSupportsIPv6 ●

ProtocolType ●

ReceiveBufferSize ●

ReceiveTimeout ●

RemoteEndPoint ●

SendBufferSize ●

SendTimeout ●

SocketType ●

SupportsIPv6 ●

3. System.Net.Sockets.Socket之方法:

Accept ●

BeginAccept ●

BeginConnect ●

BeginReceive ●

BeginReceiveFrom ●

BeginReceiveMessageFrom ●

BeginSend ●

BeginSendFile ●

BeginSendTo ●

Bind ●

Close ●

Connect ●

EndAccept ●

EndConnect ●

EndReceive ●

EndReceiveFrom ●

EndReceiveMessageFrom ●

EndSend ●

Page 28: Socket - Gotop

3-28

EndSendFile ●

EndSendTo ●

GetSocketOption ●

IOControl ●

Listen ●

Poll ●

Receive ●

ReceiveFrom ●

ReceiveMessageFrom ●

Select ●

Send ●

SendFile ●

SendTo ●

SetSocketOption ●

Shutdown ●

System.Net.Sockets.Socket類別在應用程式發展上同樣可分為兩類:(1)Stream

Socket;(2)Datagram Socket。

Stream Socket Client/Server ►

Page 29: Socket - Gotop

3-29

3Socket

System.Net.Sockets.Socket類別在處理伺服端程式時,首先以 Socket建構函式

建立伺服端之 Socket,待伺服端 Socket建立之後,則以 Listen方法表示伺服

端應用程式開始等待用戶端之連線,當接收到來自用戶端的連線請求時,便

以 Accept方法建立與用戶端的連線。在傳遞資料上,伺服端與用戶端之間,

可透過 Receive及 Send方法接收及傳送資料。最後則以 Close方法關閉伺服端

Socket。

就用戶端應用程式而言,Socket建構函式是與伺服端(需指定主機的 IP位址及

通訊埠)建立連線之用,並以 Connect方法建立與伺服端的連線。當伺服端收

到連線請求時,則由伺服端的 Accept方法建立此連線。接著可利用 Receive及

Send方法接收及傳送資料,最後並以 Close方法關閉 Socket連線。

Datagram Socket ►

由於 Datagram Socket並不需要建立雙方的連線關係,因此只需利用 ReceiveFrom及

SendTo方法接收及傳送資料。

在 System.Net.Sockets中,除了 Socket類別之外,另外提供以下之類別,以簡化

TCP與 UDP應用程式之開發:

System.Net.Sockets.TcpListener ● :TCP伺服端應用程式。 System.Net.Sockets.TcpClient ● :TCP用戶端應用程式。 System.Net.Sockets.UdpClient ● :UDP應用程式。

System.Net.Sockets.TcpListener支援 TCP伺服端應用程式之開發,其成員有:

Page 30: Socket - Gotop

3-30

1. 建構函式:

public TcpListener(int port)

public TcpListener(IPEndPoint localEP)

public TcpListener(IPAddress localaddr, int port)

2. System.Net.Sockets.TcpListener之屬性:

LocalEndpoint ●

3. System.Net.Sockets.TcpListener之方法:

AcceptSocket ●

AcceptTcpClient ●

Pending ●

Start ●

Stop ●

下圖為 System.Net.Sockets.TcpListener在 TCP伺服端應用程式的架構圖:

Page 31: Socket - Gotop

3-31

3Socket

System.Net.Sockets.TcpClient用以支援 TCP用戶端應用程式之開發,其成員有:

1. 建構函式:

public TcpClient()

public TcpClient(AddressFamily family)

public TcpClient(IPEndPoint localEP)

public TcpClient(string hostname, int port)

2. System.Net.Sockets.TcpClient之屬性:

LingerState ●

NoDelay ●

ReceiveBufferSize ●

ReceiveTimeout ●

SendBufferSize ●

SendTimeout ●

3. System.Net.Sockets.TcpClient之方法:

Close ●

Connect ●

GetStream ●

下圖為 System.Net.Sockets.TcpClient在 TCP用戶端應用程式的架構圖:

Page 32: Socket - Gotop

3-32

System.Net.Sockets.UdpClient用以支援 UDP應用程式之開發,其成員有:

1. 建構函式:

public UdpClient()

public UdpClient(AddressFamily family)

public UdpClient(int port)

public UdpClient(IPEndPoint localEP)

public UdpClient(int port, AddressFamily family)

public UdpClient(string hostname, int port)

2. System.Net.Sockets.UdpClient之方法:

Close ●

Connect ●

DropMulticastGroup ●

JoinMulticastGroup ●

Receive ●

Send ●

下圖為 System.Net.Sockets.UdpClient在 UDP端應用程式的架構圖:

Page 33: Socket - Gotop

3-33

3Socket

下表為 Java與Microsoft .NET在支援 TCP伺服端應用程式之比較:

Java Microsoft .NET 說明

ServerSocket TcpListener 建立伺服端 Socket。- Start 等候自用戶端的連結請求。

accept AcceptTcpClient 接受自用戶端的連結請求,並且建立與用戶端之連結。

(DataInputStream)read

(NetworkStream)Read

接收來自用戶端所傳送的資料。

(DataOutputStream)write

(NetworkStream)Write

傳送資料至用戶端。

Close Stop 關閉 Socket及與用戶端之通訊連結。

下表為 Java與Microsoft .NET在支援 TCP用戶端應用程式之比較:

Java Microsoft .NET 說明

Socket TcpClient 建立用戶端 Socket。- Connect 建立與伺服端之連結。

(DataInputStream)read

(NetworkStream)Read

接收來自伺服端所傳送的資料。

(DataOutputStream)write

(NetworkStream)Write

傳送資料至伺服端。

close Close 關閉 Socket及與伺服端之通訊連結。

下表為 Java與Microsoft .NET在支援 UDP端應用程式之比較:

Java Microsoft .NET 說明

DatagramSocket UdpClient 建立 Datagram Socket。DatagramPacket - 建立 Datagram Packet。(DatagramSocket)receive

(UdpClient)Receive

接收 Datagram Packet。

(DatagramSocket)send

(UdpClient)Send

傳送 Datagram Packet。

close Close 關閉 Datagram Socket。

Page 34: Socket - Gotop

3-34

【本章結論】 ⿅

在本章中,筆者分別介紹網路應用程式的核心-Socket的不同類型 API,包括

Berkeley Socket Distribution、Java類別、Microsoft WinSock API、Microsoft WinSock

Control及Microsoft .NET所提供之類別,藉由彼此之間的比較,讀者可瞭解之間的

差異。

【參考資料】 ⿅

[1] Microsoft Developer Network.

[2] Java 2 Platform, Standard Edition, API Specification

[3] Andrew S. Tanenbaum, Computer Networking, Prentice Hall, 1996.

[4] Dave Roberts, Developing for the Internet with Winsock, The Coriolis Group, 1995.

[5] Douglas E. Comer, and David L. Stevens, Internetworking with TCP/IP Volume III

Client-Server Programming and Applications BSD Socket Version, Prentice Hall,

1988.

[6] Stevens W. Richard, UNIX Network Programming, Prentice Hall, 1991.

[7] Stevens W. Richard, TCP/IP Illustrated Volume I, Addison-Wesley, 1996.

[8] William Stallings, Business Data Communications, 5/E, Prentice Hall, 2004.