標籤:io ar os 使用 sp 資料 on div cti
首先我們要瞭解一下幾點內容:
1、網路中進程之間如何通訊?2、Socket是什嗎?3、socket的基本操作3.1、socket()函數3.2、bind()函數3.3、listen()、connect()函數3.4、accept()函數3.5、read()、write()函數等3.6、close()函數4、socket中TCP的三向交握建立串連詳解5、socket中TCP的四次握手釋放串連詳解6、一個例子現階段socket通訊使用TCP、UDP協議,相對應UDP來說,TCP則是比較安全穩定的協議了。本文只涉及到TCP協議來說socket通訊。首先講述TCP/IP的三向交握,在握手基礎上延伸socket通訊的基本過程。 下面介紹對於應屆生畢業面試來說是非常熟悉的,同時也是最臭名昭著的三向交握: 1 用戶端發送syn報文到伺服器端,共置發送序號為x。 2 伺服器端接收到用戶端發送的請求報文,然後向用戶端發送syn報文,並且發送確認序號x+1,共置發送序號為y。 3 用戶端受到伺服器發送確認報文後,發送確認訊號y+1,共置發送序號為z。至此用戶端和伺服器端建立串連。 在此基礎上,socket串連過程: 伺服器監聽:伺服器端socket並不定位具體的用戶端socket,而是處於等待監聽狀態,即時監控網路狀態。 用戶端請求:用戶端clientSocket發送串連請求,目標是伺服器的serverSocket。為此,clientSocket必須知道serverSocket的地址和連接埠號碼,進行掃描發出串連請求。 串連確認:當伺服器socket監聽到或者是受到用戶端socket的串連請求時,伺服器就響應用戶端的請求,建議一個新的socket,把伺服器socket發送給用戶端,一旦用戶端確認串連,則串連建立。 註:在串連確認階段:伺服器socket即使在和一個用戶端socket建立串連後,還在處於監聽狀態,仍然可以接收到其他用戶端的串連請求,這也是一對多產生的原因。 簡單說明串連過程: 下面開始進行程式碼分析了: 伺服器端:TcpServer.cs 複製代碼 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Net; 7 using System.Net.Sockets; 8 9 namespace TcpServer10 {11 class Program12 {13 static void Main(string[] args)14 {15 //確定連接埠號碼16 int port = 6000;17 18 //設定串連IP19 string host = "127.0.0.1";20 21 //將IP地址字串轉化為IP地址執行個體22 IPAddress ip = IPAddress.Parse(host);23 24 //將網路端點表示為 IP 位址和連接埠號碼25 IPEndPoint ipe = new IPEndPoint(ip, port);26 27 //建立Socket 28 //addressFamily 參數指定 Socket 類使用的定址方案29 //socketType 參數指定 Socket 類的類型30 //protocolType 參數指定 Socket 使用的協議。 31 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);32 33 //socket與本地終結點建立關聯34 socket.Bind(ipe);35 while (true)36 {37 //開始監聽連接埠38 socket.Listen(0);39 40 Console.WriteLine("服務已開啟,請等待....."+ DateTime.Now.ToString());41 42 //為建立的串連建立新的Socket目的為用戶端將要建立串連43 Socket serverSocket = socket.Accept();44 Console.WriteLine("串連已建立......" + DateTime.Now.ToString());45 46 string recStr =string.Empty;47 //定義緩衝區用於接收用戶端的資料48 byte[] recbyte = new byte[1024];49 50 //返回接收到的位元組數51 int bytes = serverSocket.Receive(recbyte, recbyte.Length, 0);52 53 //將接收到的位元組抓獲年華為string54 //參數一:位元組數組 參數二:起始索引 參數三:總長度55 recStr += Encoding.ASCII.GetString(recbyte, 0, bytes);56 57 Console.WriteLine("伺服器接收到用戶端的資訊:" + recStr + " " + DateTime.Now.ToString()+"\n\n");58 59 60 //服務端給用戶端回送訊息61 string strSend = "Hello Client!";62 byte[] sendByte = new byte[1024];63 //將發送的字串轉換為byte[]64 sendByte = Encoding.ASCII.GetBytes(strSend);65 66 //服務端發送資料67 serverSocket.Send(sendByte, sendByte.Length, 0);68 69 serverSocket.Close();70 }71 }72 }複製代碼 用戶端的代碼: 複製代碼 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Net; 7 using System.Net.Sockets; 8 9 namespace TcpClient10 {11 class Program12 {13 static int port = 6000; //監聽連接埠號碼14 static string host = "127.0.0.1"; //串連服務端IP15 static IPAddress ip = IPAddress.Parse(host); //將IP地址轉換為IP執行個體16 static IPEndPoint ipe = new IPEndPoint(ip, port);//將網路端點表示為 IP 位址和連接埠號碼17 static Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立用戶端Socket18 19 static void Main(string[] args)20 {21 22 clientSocket.Connect(ipe); //用戶端開始串連服務端23 24 25 string sendStr = "Hello,Server!"; //向伺服器發送訊息26 byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);27 clientSocket.Send(sendBytes);28 29 30 string revStr = ""; //接收來自伺服器的訊息31 byte[] revBytes = new byte[4096];32 int bytes = clientSocket.Receive(revBytes, revBytes.Length, 0);33 34 revStr += Encoding.ASCII.GetString(revBytes, 0, bytes);35 Console.WriteLine("來自服務端的回應:{0}",revStr);36 37 clientSocket.Close();38 }39 }40 }
C# Socket學習筆記一