Socket網絡編程(1)


TCP/IP 簡單介紹

  • 應用層 (Application):應用層是個很廣泛的概念,有一些基本相同的系統級 TCP/IP 應用以及應用協議,也有許多的企業商業應用和互聯網應用。
  • 傳輸層 (Transport):傳輸層包括 UDP 和 TCP,UDP 幾乎不對報文進行檢查,而 TCP 提供傳輸保證。
  • 網絡層 (Network):網絡層協議由一系列協議組成,包括 ICMP、IGMP、RIP、OSPF、IP(v4,v6) 等。
  • 鏈路層 (Link):又稱為物理數據網絡接口層,負責報文傳輸。

    

Socket相關概念

  • socket的英文原義是“孔”或“插座”。作為進程通信機制,取后一種意思。通常也稱作“套接字”,用於描述IP地址和端口,是一個通信鏈的句柄。(其實就是兩個程序通信用的。)
  • socket非常類似於電話插座。以一個電話網為例。電話的通話雙方相當於相互通信的2個程序,電話號碼就是IP地址。任何用戶在通話之前,首先要占有一部電話機,相當於申請一個socket;同時要知道對方的號碼,相當於對方有一個固定的socket。然后向對方撥號呼叫,相當於發出連接請求。對方假如在場並空閑,拿起電話話筒,雙方就可以正式通話,相當於連接成功。雙方通話的過程,是一方向電話機發出信號和對方從電話機接收信號的過程,相當於向socket發送數據和從socket接收數據。通話結束后,一方掛起電話機相當於關閉socket,撤消連接。
  • 在Internet上有很多這樣的主機,這些主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不同的端口對應於不同的服務(應用程序)。
    例如:http 使用80端口  ftp使用21端口 smtp 25端口

按端口號可分為3大類

  (1)公認端口(WellKnownPorts):從0到1023,它們緊密綁定(binding)於一些服務。通常這些端口的通訊明確表明了某種服務的協議。例如:80端口實際上總是HTTP通訊。

  (2)注冊端口(RegisteredPorts):從1024到49151。它們松散地綁定於一些服務。也就是說有許多服務綁定於這些端口,這些端口同樣用於許多其它目的。例如:許多系統處理動態端口從1024左右開始。

  (3)動態和/或私有端口(Dynamicand/orPrivatePorts):從49152到65535。理論上,不應為服務分配這些端口。實際上,機器通常從1024起分配動態端口。

  • 有兩種類型:
•流式Socket(STREAM):
        是一種面向連接的Socket,針對於面向連接的TCP服務應用,安全,但是效率低;
•數據報式Socket(DATAGRAM):
        是一種無連接的Socket,對應於無連接的UDP服務應用.不安全(丟失,順序混亂,在接收端要分析重排及要求重發),但效率高.
 

Socket的一般應用模式(服務器端和客戶端)

 

1.服務端welcoming socket 開始監聽端口(負責監聽客戶端連接信息)
2.客戶端client socket連接服務端指定端口(負責接收和發送服務端消息)
3.服務端welcoming socket 監聽到客戶端連接,創建connection socket。(負責和客戶端通信)

 

服務器端的Socket(至少需要兩個)
•一個負責接收客戶端連接請求(但不負責與客戶端通信)
•每成功接收到一個客戶端的連接便在服務端產生一個對應的負責通信的Socket
•在接收到客戶端連接時創建.
•為每個連接成功的客戶端請求在服務端都創建一個對應的Socket(負責和客戶端通信).
客戶端的Socket
•客戶端Socket
•必須指定要連接的服務端地址和端口。
•通過創建一個Socket對象來初始化一個到服務器端的TCP連接。
 

Socket的通訊過程

 
服務器端:
•申請一個socket
•綁定到一個IP地址和一個端口上
•開啟偵聽,等待接授連接
客戶端:
•申請一個socket
•連接服務器(指明IP地址和端口號)
服務器端接到連接請求后與客戶端建立連接並進行通訊,原監聽socket繼續監聽。
 
Socket的構造函數:
 
連接通過構造函數完成。
public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
•AddressFamily 成員指定 Socket 用來解析地址的尋址方案。例如,InterNetwork 指示當 Socket 使用一個 IP 版本 4 地址連接。
•SocketType 定義要打開的 Socket 的類型
•Socket 類使用 ProtocolType 枚舉向 Windows Sockets API 通知所請求的協議
如:mySocket = new Socket(AddressFamily.InterNetwork,   SocketType.Stream, ProtocolType.Tcp);

AddressFamily.InterNetWork:使用 IP4地址

SocketType.Stream:支持可靠、雙向、基於連接的字節流,而不重復數據。此類型的 Socket 與單個對方主機進行通信,並且在通信開始之前需要遠程主機連接。Stream 使用傳輸控制協議 (Tcp) ProtocolType 和 InterNetworkAddressFamily。

ProtocolType.Tcp:使用傳輸控制協議。

注意:

  1. 至少要定義一個要連接的遠程主機的IP和端口號。
  2. 端口號必須在 1 和 65535之間,最好在1024以后。
  3. 要連接的遠程主機必須正在監聽指定端口,也就是說你無法隨意連接遠程主機。
  4. 如:

IPAddress addr = IPAddress.Parse("127.0.0.1");

IPEndPoint endp = new IPEndPoint(addr, 10001);

      服務端先綁定:serverWelcomeSocket.Bind(endp)

      客戶端再連接:clientSocket.Connect(endp)

5.一個Socket一次只能連接一台主機。

6.Socket關閉后無法再次使用。
7.每個Socket對象只能一台遠程主機連接. 如果你想連接到多台遠程主機, 你必須創建多個Socket對象.
 

Socket的方法

 
  • ------------------相關類--------------------------
  • IPAddress類:包含了一個IP地址
  • IPEndPoint類:包含了一對IP地址和端口號
  • --------------------方法們------------------------------
  • Socket (): 創建一個Socket
  • Bind(): 綁定一個本地的IP和端口號(IPEndPoint)
  • Listen(): 讓Socket偵聽傳入的連接嘗試,並指定偵聽隊列容量
  • Connect(): 初始化與另一個Socket的連接
  • Accept(): 接收連接並返回一個新的socket
  • Send(): 輸出數據到Socket
  • Receive(): 從Socket中讀取數據
  • Close(): 關閉Socket (銷毀連接)

Socket通信基本流程圖

 

基於TCP的Socket編程(TCP service:可靠的字節流傳輸)

 

 

 結語

      根據之前的學習筆記,關於Socket的基礎知識就介紹到這里,之后會做一個小案例,可以更好的對socket的理解。主要是項目中需要用到網絡編程方面的東西,周末沒事干,就將之前socket的方面的知識點復習了一下,也為了更好更快的投入工作中.....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM