亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#中的Socket編程詳解

 更新時間:2022年01月14日 15:32:40   作者:癡者工良  
本文詳細講解了C#中的Socket編程,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

文章按照 Socket 的 創(chuàng)建、連接、傳輸數(shù)據(jù)、釋放資源的過程來寫。給出方法、參數(shù)的詳細信息。

一,網絡基礎

說到 Socket,需要學習一下TCP/IP的知識,了解一下OSI 網絡模。

推薦別人的文章,可以很快地了解這些。

http://chabaoo.cn/article/234633.htm

http://chabaoo.cn/article/234653.htm

二,Socket 對象

無論是服務器還是客戶端,都要創(chuàng)建一個 SOCKET 對象,創(chuàng)建方法一致。

以下是常見的Socket對象創(chuàng)建實例

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//監(jiān)控 ip4 地址,套接字類型為 TCP ,協(xié)議類型為 TCP

其有三個構造函數(shù)

public Socket(SocketInformation socketInformation);
public Socket(SocketType socketType, ProtocolType protocolType);
public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);

第一個構造函數(shù),SocketInformation 對象保存的是

Socket(SocketType, ProtocolType)

實質上跟第二個構造函數(shù)是一樣的。就好像你可以直接把( 一個蘋果 , 一個梨)直接放進籃子,也可以先給 水果包裝好 再放進籃子里。

下面將解釋所有參數(shù)的意義。

SocketType

指定 Socket 類的實例表示的套接字類型。

TCP 用主機的IP地址加上主機上的端口號作為 TCP 連接的端點,這種端點就叫做套接字(socket)或插口。 套接字用(IP地址:端口號)表示。

SocketType 是enum 類型,其字段如下

SocketType

  值 

對應的ProtocolType

描述

Unknown

-1

  Unknown              

指定未知的 Socket 類型。

Stream(使用字節(jié)流)

1

Tcp

支持可靠、雙向、基于連接的字節(jié)流

Dgram(使用數(shù)據(jù)報)

2

Udp

面向無連接

Raw

3

Icmp、lgmp

支持對基礎傳輸協(xié)議的訪問

Rdm

4

 

支持無連接、面向消息、以可靠方式發(fā)送的消息,

并保留數(shù)據(jù)中的消息邊界

Seqpacket

5

 

在網絡上提供排序字節(jié)流的面向連接且可靠的雙向傳輸

如需了解更詳細的資料,請查閱Microsoft文檔

地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.sockettype?view=netframework-4.7.2

ProtocolType

表示協(xié)議類型,是一個enum 類型。

其所有字段如下

SocketType

  值 

對應的ProtocolType

描述

Unknown

-1

  Unknown              

指定未知的 Socket 類型。

Stream(使用字節(jié)流)

1

Tcp

支持可靠、雙向、基于連接的字節(jié)流

Dgram(使用數(shù)據(jù)報)

2

Udp

面向無連接

Raw

3

Icmp、lgmp

支持對基礎傳輸協(xié)議的訪問

Rdm

4

 

支持無連接、面向消息、以可靠方式發(fā)送的消息,

并保留數(shù)據(jù)中的消息邊界

Seqpacket

5

 

在網絡上提供排序字節(jié)流的面向連接且可靠的雙向傳輸

AddressFamily

表示使用的網絡尋址方案,是一個 enum 類型。

地址類型

描述

AppleTalk16

AppleTalk 地址。

Atm22

本機 ATM 服務地址。

Banyan21

Banyan 地址。

Ccitt10

CCITT 協(xié)議(如 X.25)的地址。

Chaos5

MIT CHAOS 協(xié)議的地址。

Cluster24

Microsoft 群集產品的地址。

DataKit9

Datakit 協(xié)議的地址。

DataLink13

直接數(shù)據(jù)鏈接接口地址。

DecNet12

DECnet 地址。

Ecma8

歐洲計算機制造商協(xié)會 (ECMA) 地址。

FireFox19

FireFox 地址。

HyperChannel15

NSC Hyperchannel 地址。

Ieee1284425

IEEE 1284.4 工作組地址。

ImpLink3

ARPANET IMP 地址。

InterNetwork2

IP 版本 4 的地址。

InterNetworkV623

IP 版本 6 的地址。

Ipx6

IPX 或 SPX 地址。

Irda26

IrDA 地址。

Iso7

ISO 協(xié)議的地址。

Lat14

LAT 地址。

Max29

MAX 地址。

NetBios17

NetBios 地址。

NetworkDesigners28

支持網絡設計器 OSI 網關的協(xié)議的地址。

NS6

Xerox NS 協(xié)議的地址。

Osi7

OSI 協(xié)議的地址。

Pup4

PUP 協(xié)議的地址。

Sna11

IBM SNA 地址。

Unix1

Unix 本地到主機地址。

Unknown-1

未知的地址族。

Unspecified0

未指定的地址族。

VoiceView18

VoiceView 地址。

Socket 官方文檔地址

https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket?redirectedfrom=MSDN&view=netframework-4.7.2

三,Bind() 綁定與 Connect() 連接

Bind() 用于綁定IPEndPoint 對象,在服務端使用。

Connect() 在客戶端使用,用于連接服務端。

創(chuàng)建 Socket 對象后,接著綁定本地Socket / 連接服務端。

Bind()

public void Bind (System.Net.EndPoint localEP);

使用方法

        Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPAddress iP = IPAddress.Parse("127.0.0.1");

        //上面不重要,看下面
    //IPEndPoint iPEndPoint = new IPEndPoint(iP, 2300);
    //serverSocket.Bind(iPEndPoint);

       serverSocket.Bind(new IPEndPoint(iP, 2300))

你將在在本地創(chuàng)建IPEndPoint 對象,擁有此 ip:post 的訪問權限。目的是綁定本地機器的某個端口,所有經過此端口的數(shù)據(jù)就歸你管了。

Connect()

與遠程主機建立連接。Connect() 有四個重載方法,不必關注,只需知道,必需提供 IP 和 Post 兩個值。

使用方法

            IPAddress iP = IPAddress.Parse("127.0.0.1");
            IPEndPoint iPEndPoint = new IPEndPoint(iP, 2300);
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        //創(chuàng)建與遠程主機的連接
            serverSocket.Connect(iPEndPoint);

四,Listen() 監(jiān)聽請求連接 和 Accept() 接收連接請求

Listen()

監(jiān)控所有發(fā)送到此主機的、特點端口的連接請求。服務端使用,客戶端不需要。

public void Listen (int backlog);

使用 Bind() 后,使用 Listen() 方法進行監(jiān)控,backlog 參數(shù)指定可排隊等待接受的傳入連接的數(shù)量,即掛起的連接隊列的最大長度。

示例

serverSocket.Listen(10);    //開始監(jiān)聽

Accept()

Accept() 以同步方式監(jiān)聽套接字,在連接請求隊列中提取第一個掛起的連接請求,然后創(chuàng)建并返回一個新的 Socket 對象。

代碼示例

            //創(chuàng)建終結點(EndPoint)
            IPAddress ip = IPAddress.Any;             
            IPEndPoint ipe = new IPEndPoint(ip, 8000);

            //創(chuàng)建 socket 并開始監(jiān)聽
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(ipe);
            serverSocket.Listen(10);//開始監(jiān)聽

            //接受到client連接,為此連接建立新的socket,并接受信息
            Socket temp = serverSocket.Accept();//為新建連接創(chuàng)建新的socket
//關閉連接
temp.Close();

注意的是,每次建立連接是一個 Accept() 對象,如果你要進行 服務器-客戶端互相通訊,應使用同一個 Accept() 對象。每個 Accept 對象都是 從客戶端請求建立開始的,期間只要使用同一個 Accept 對象,都可以進行數(shù)據(jù)傳輸。

五,Receive() 與 Send()

  • Receive() 接收信息
  • Send() 發(fā)送信息

在服務端和客戶端都使用這兩個方法。

Receive()

使用示例

string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//從客戶端接受信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);

直接從微軟那復制來的。

Receive(Byte[], Int32, Int32, SocketFlags, SocketError)

使用指定的 Socket,從綁定的 SocketFlags 接收數(shù)據(jù),將數(shù)據(jù)存入接收緩沖區(qū)。

Receive(Byte[], Int32, Int32, SocketFlags)

使用指定的 Socket,從綁定的 SocketFlags 接收指定的字節(jié)數(shù),存入接收緩沖區(qū)的指定偏移量位置。

Receive(IList<ArraySegment<Byte>>, SocketFlags, SocketError)

使用指定的 Socket,從綁定的 SocketFlags 接收數(shù)據(jù),將數(shù)據(jù)存入接收緩沖區(qū)列表中。

Receive(Byte[], Int32, SocketFlags)

使用指定的 Socket,從綁定的 SocketFlags 接收指定字節(jié)數(shù)的數(shù)據(jù),并將數(shù)據(jù)存入接收緩沖區(qū)。

Receive(Byte[], SocketFlags)

使用指定的 Socket,從綁定的 SocketFlags 接收數(shù)據(jù),將數(shù)據(jù)存入接收緩沖區(qū)。

Receive(IList<ArraySegment<Byte>>, SocketFlags)

使用指定的 Socket,從綁定的 SocketFlags 接收數(shù)據(jù),將數(shù)據(jù)存入接收緩沖區(qū)列表中。

Receive(IList<ArraySegment<Byte>>)

從綁定的 Socket 接收數(shù)據(jù),將數(shù)據(jù)存入接收緩沖區(qū)列表中。

Receive(Byte[])

從綁定的 Socket 套接字接收數(shù)據(jù),將數(shù)據(jù)存入接收緩沖區(qū)。

參數(shù)

Byte[] buffer

Byte類型的數(shù)組,它是存儲接收到的數(shù)據(jù)的位置。

Int32 offset

buffer參數(shù)中的位置,用于存儲所接收的數(shù)據(jù)。

Int32 size

要接收的字節(jié)數(shù)。

SocketFlags socketFlags

SocketFlags值的按位組合。

SocketError errorCode

一個SocketError對象,它存儲套接字錯誤。

socketFlags 默認值為0 或 None ,筆者沒有搞懂socketFlags 的應用場景。

返回

返回已成功讀取的字節(jié)數(shù)。

Send()

send()跟Receive()用法相似,

示例代碼如下

string str = "hello";
byte[] a = Encoding.UTF8.GetBytes(str);
send = socket.Send(a, 0);

發(fā)送/接收 都是使用 byte[] 字節(jié)流,所以接收時要進行轉換。

六,釋放資源

有 Accept 釋放和 Socket 的釋放。

Accept 是連接對象,一個 Socket 可能有數(shù)十個 Accept 連接。

使用 Shutdown( ) 方法可以 禁止 Asscpt 對象的操作(禁用某個 Socket 對象 的發(fā)送和接收)。

public void Shutdown (System.Net.Sockets.SocketShutdown how);

SocketShutdown 是一個 enum 類型。

實例

temp.Shutdown(SocketShutdown.Receive);
            //禁止接收
使用描述
發(fā)送Send禁止對此發(fā)送Socket。
接收Receive禁用對此接收Socket。
消息和傳送Both禁用發(fā)送和接收對此Socket。

close()

會直接釋放資源,Accept 和 Socket 對象都可以使用。使用后對象將徹底釋放。

七,IPAddress 和IPEndPoint

//引入
using System.Net;

IPAddress 用來處理IP地址、轉換IP地址

IPAddress.Parse() 方法可以把以小數(shù)點隔分的十進制 IP 表示轉化成 IPAddress 類。

IPAddress ip = IPAddress.Parse("127.0.0.1");//把ip地址字符串轉換為IPAddress類型的實例

IPAddress提供4個只讀字段

  • Any 用于代表本地系統(tǒng)可用的任何IP地址
  • Broadcase用于代表本地網絡的IP廣播地址
  • Loopback用于代表系統(tǒng)的回送地址
  • None用于代表系統(tǒng)上沒有網絡接口

關于其類型的使用和全部方法、構造函數(shù)等,請查看文檔Microsoft文檔。

地址https://docs.microsoft.com/zh-cn/dotnet/api/system.net.ipaddress?view=netframework-4.7.2

IPEndPoint 表示IPAddress對象與端口的綁定

IPAddress ip = IPAddress.Any;              //把ip地址字符串轉換為IPAddress類型的實例
IPEndPoint ipe = new IPEndPoint(ip, 8000);//用指定的端口和ip初始化IPEndPoint類的新實例

上面的代碼,創(chuàng)建一個監(jiān)控點,端口是 8000,對象是 本地所有IP。

另外,此類能夠獲取查看端口的值范圍,除此外,此類沒有太大意義。

Microsoft 文檔地址https://docs.microsoft.com/zh-cn/dotnet/api/system.net.ipendpoint?view=netframework-4.7.2

到此這篇關于C#中的Socket編程詳解的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • WPF實現(xiàn)多運算符表達式計算器

    WPF實現(xiàn)多運算符表達式計算器

    這篇文章主要為大家詳細介紹了WPF實現(xiàn)多運算符表達式計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • WPF+WriteableBitmap實現(xiàn)高性能曲線圖的繪制

    WPF+WriteableBitmap實現(xiàn)高性能曲線圖的繪制

    這篇文章主要為大家詳細介紹了如何利用WPF+WriteableBitmap實現(xiàn)高性能曲線圖的繪制,文中的示例代碼講解詳細,感興趣的小伙伴可以嘗試一下
    2022-08-08
  • C# 實現(xiàn)TXT文檔轉Table的示例代碼

    C# 實現(xiàn)TXT文檔轉Table的示例代碼

    這篇文章主要介紹了C# 實現(xiàn)TXT文檔轉Table的示例代碼,幫助大家更好的理解和學習c#,感興趣的朋友可以了解下
    2020-12-12
  • winform 實現(xiàn)選擇文件和選擇文件夾對話框的簡單實例

    winform 實現(xiàn)選擇文件和選擇文件夾對話框的簡單實例

    下面小編就為大家?guī)硪黄獁inform 實現(xiàn)選擇文件和選擇文件夾對話框的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C#在運行時動態(tài)創(chuàng)建類型的實現(xiàn)方法

    C#在運行時動態(tài)創(chuàng)建類型的實現(xiàn)方法

    這篇文章主要介紹了C#在運行時動態(tài)創(chuàng)建類型的實現(xiàn)方法,主要通過動態(tài)生成C#代碼再編譯成程序集來實現(xiàn)動態(tài)創(chuàng)建類型的,需要的朋友可以參考下
    2014-09-09
  • C#實現(xiàn)類似qq的屏幕截圖程序

    C#實現(xiàn)類似qq的屏幕截圖程序

    C#實現(xiàn)類似qq的屏幕截圖程序...
    2007-04-04
  • C#如何通過RFC連接sap系統(tǒng)

    C#如何通過RFC連接sap系統(tǒng)

    這篇文章主要為大家詳細介紹了C#如何通過RFC連接sap系統(tǒng)的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • c#中object、var和dynamic的區(qū)別小結

    c#中object、var和dynamic的區(qū)別小結

    這篇文章主要給大家介紹了關于c#中object、var和dynamic的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • C#利用iTextSharp添加PDF水印

    C#利用iTextSharp添加PDF水印

    這篇文章主要為大家詳細介紹了C#利用iTextSharp添加PDF水印的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • C# FileStream復制大文件

    C# FileStream復制大文件

    這篇文章主要為大家詳細介紹了C# FileStream復制大文件的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評論