C# Socket學習筆記一

來源:互聯網
上載者:User

標籤: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學習筆記一

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.