最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中的Socket編程詳解

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

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

一,網(wǎng)絡(luò)基礎(chǔ)

說到 Socket,需要學(xué)習(xí)一下TCP/IP的知識,了解一下OSI 網(wǎng)絡(luò)模。

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

http://m.fzitv.net/article/234633.htm

http://m.fzitv.net/article/234653.htm

二,Socket 對象

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

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

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

其有三個(gè)構(gòu)造函數(shù)

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

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

Socket(SocketType, ProtocolType)

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

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

SocketType

指定 Socket 類的實(shí)例表示的套接字類型。

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

SocketType 是enum 類型,其字段如下

SocketType

  值 

對應(yīng)的ProtocolType

描述

Unknown

-1

  Unknown              

指定未知的 Socket 類型。

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

1

Tcp

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

Dgram(使用數(shù)據(jù)報(bào))

2

Udp

面向無連接

Raw

3

Icmp、lgmp

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

Rdm

4

 

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

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

Seqpacket

5

 

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

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

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

ProtocolType

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

其所有字段如下

SocketType

  值 

對應(yīng)的ProtocolType

描述

Unknown

-1

  Unknown              

指定未知的 Socket 類型。

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

1

Tcp

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

Dgram(使用數(shù)據(jù)報(bào))

2

Udp

面向無連接

Raw

3

Icmp、lgmp

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

Rdm

4

 

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

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

Seqpacket

5

 

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

AddressFamily

表示使用的網(wǎng)絡(luò)尋址方案,是一個(gè) enum 類型。

地址類型

描述

AppleTalk16

AppleTalk 地址。

Atm22

本機(jī) ATM 服務(wù)地址。

Banyan21

Banyan 地址。

Ccitt10

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

Chaos5

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

Cluster24

Microsoft 群集產(chǎn)品的地址。

DataKit9

Datakit 協(xié)議的地址。

DataLink13

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

DecNet12

DECnet 地址。

Ecma8

歐洲計(jì)算機(jī)制造商協(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

支持網(wǎng)絡(luò)設(shè)計(jì)器 OSI 網(wǎng)關(guān)的協(xié)議的地址。

NS6

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

Osi7

OSI 協(xié)議的地址。

Pup4

PUP 協(xié)議的地址。

Sna11

IBM SNA 地址。

Unix1

Unix 本地到主機(jī)地址。

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 對象,在服務(wù)端使用。

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

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

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 的訪問權(quán)限。目的是綁定本地機(jī)器的某個(gè)端口,所有經(jīng)過此端口的數(shù)據(jù)就歸你管了。

Connect()

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

使用方法

            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)建與遠(yuǎn)程主機(jī)的連接
            serverSocket.Connect(iPEndPoint);

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

Listen()

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

public void Listen (int backlog);

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

示例

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

Accept()

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

代碼示例

            //創(chuàng)建終結(jié)點(diǎn)(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
//關(guān)閉連接
temp.Close();

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

五,Receive() 與 Send()

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

在服務(wù)端和客戶端都使用這兩個(gè)方法。

Receive()

使用示例

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

直接從微軟那復(fù)制來的。

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

一個(gè)SocketError對象,它存儲套接字錯(cuò)誤。

socketFlags 默認(rèn)值為0 或 None ,筆者沒有搞懂socketFlags 的應(yīng)用場景。

返回

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

Send()

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

示例代碼如下

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

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

六,釋放資源

有 Accept 釋放和 Socket 的釋放。

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

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

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

SocketShutdown 是一個(gè) enum 類型。

實(shí)例

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

close()

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

七,IPAddress 和IPEndPoint

//引入
using System.Net;

IPAddress 用來處理IP地址、轉(zhuǎn)換IP地址

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

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

IPAddress提供4個(gè)只讀字段

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

關(guān)于其類型的使用和全部方法、構(gòu)造函數(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地址字符串轉(zhuǎn)換為IPAddress類型的實(shí)例
IPEndPoint ipe = new IPEndPoint(ip, 8000);//用指定的端口和ip初始化IPEndPoint類的新實(shí)例

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

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

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

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

相關(guān)文章

  • 基于C#實(shí)現(xiàn)串口通信

    基于C#實(shí)現(xiàn)串口通信

    這篇文章主要為大家詳細(xì)介紹了基于C#實(shí)現(xiàn)串口通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#?函數(shù)返回多個(gè)值的方法詳情

    C#?函數(shù)返回多個(gè)值的方法詳情

    這篇文章主要介紹了C#函數(shù)返回多個(gè)值的方法詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • C#實(shí)現(xiàn)閃動托盤圖標(biāo)效果的方法

    C#實(shí)現(xiàn)閃動托盤圖標(biāo)效果的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)閃動托盤圖標(biāo)效果的方法,涉及C# ImageList控件的使用技巧,需要的朋友可以參考下
    2016-06-06
  • c# 通過經(jīng)緯度查詢 具體的地址和區(qū)域名稱

    c# 通過經(jīng)緯度查詢 具體的地址和區(qū)域名稱

    最近項(xiàng)目需要通過經(jīng)緯度查詢 具體的地址和區(qū)域名稱,通過查詢網(wǎng)絡(luò)資源,發(fā)現(xiàn)提供的大多是得到具體的地址而對區(qū)域或城市名稱的獲取就不是很好把握;在這里自己搞了個(gè),需要的朋友可以參考下
    2012-11-11
  • c#打開py文件的方法

    c#打開py文件的方法

    在本篇內(nèi)容里小編給大家分享的是關(guān)于c#打開py文件的方法和步驟,需要的朋友們可以跟著學(xué)習(xí)下。
    2018-12-12
  • c# mutex互斥量的深入解析

    c# mutex互斥量的深入解析

    本篇文章主要是對c#中的mutex互斥量進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#編程中常見數(shù)據(jù)結(jié)構(gòu)的比較(Unity3D游戲開發(fā))

    C#編程中常見數(shù)據(jù)結(jié)構(gòu)的比較(Unity3D游戲開發(fā))

    在本篇內(nèi)容里我們給大家整理了關(guān)于Unity3D游戲開發(fā)中C#編程中常見數(shù)據(jù)結(jié)構(gòu)的比較相關(guān)知識點(diǎn)內(nèi)容,需要的朋友們參考下。
    2019-05-05
  • unity實(shí)現(xiàn)簡單的貪吃蛇游戲

    unity實(shí)現(xiàn)簡單的貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)簡單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • c# 線性回歸和多項(xiàng)式擬合示例詳解

    c# 線性回歸和多項(xiàng)式擬合示例詳解

    線性回歸與多項(xiàng)式擬合是兩種常用的回歸分析方法,線性回歸模型簡單,易于計(jì)算,但只適用于線性關(guān)系的數(shù)據(jù),多項(xiàng)式擬合能處理非線性數(shù)據(jù),模型更復(fù)雜,擬合度更高,但容易產(chǎn)生過擬合問題,計(jì)算成本較高,適用場景不同,線性回歸適合線性數(shù)據(jù),多項(xiàng)式擬合適合非線性數(shù)據(jù)
    2024-10-10
  • C#編程:List.ForEach與foreach循環(huán)的對比分析

    C#編程:List.ForEach與foreach循環(huán)的對比分析

    這篇文章主要介紹了C#編程:List.ForEach與foreach循環(huán)的對比分析,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03

最新評論

丹棱县| 衡水市| 黔东| 开封市| 延川县| 额敏县| 阿拉善右旗| 仪陇县| 巴南区| 宾阳县| 彭山县| 乌兰浩特市| 涡阳县| 开平市| 孙吴县| 鸡泽县| 修文县| 玉山县| 砚山县| 大埔县| 武穴市| 丹东市| 库车县| 即墨市| 蒙城县| 马关县| 胶州市| 丰原市| 胶南市| 重庆市| 赤峰市| 信阳市| 民乐县| 永福县| 南木林县| 靖安县| 河津市| 海阳市| 永胜县| 洛隆县| 玛纳斯县|