C#網絡編程(Socket編程)

文章目錄

  • 0、寫在前面的話
  • 1、Socket 介紹
    • 1.1 Socket是什么
    • 1.2 Socket在網絡中的位置
  • 2、C# 中的Socket參數
    • 2.1 超時控制參數
    • 2.2 緩沖區參數
    • 2.3 UDP專用參數
  • 3、C# 中的Socket API
    • 3.1 Socket(構造函數)
      • 3.1.1 SocketType
      • 3.1.2 ProtocolType
      • 3.1.3 AddressFamily
    • 3.2 Bind()
    • 3.3 Connect()
    • 3.4 Listen() (TCP)
    • 3.5 Accept() (TCP)
    • 3.6 Receive() 與 Send()
    • 3.7 ReceiveFrom()與SendTo()
    • 3.8 Shutdown()和Close()
  • 4、IPAddress 和 IPEndPoint
    • 4.1 IPAddress
    • 4.2 IPEndPoint

0、寫在前面的話

我創建的Unity、C#交流群,有興趣可加入大家一起學習:952914223

1、Socket 介紹

1.1 Socket是什么

Socket的英文原意是“插座”,的意思,通常在計算機編程中稱作套接字,是對對于TCP/IP的封裝,我們可以將Socket聯想成是由兩個Socket對象搭建的成的一根通信管道,管道的兩端是這兩個Socket對象,而這根管道的連接的是兩臺主機的應用進程(通過IP地址和端口號確定進程)
請添加圖片描述

1.2 Socket在網絡中的位置

在這里插入圖片描述

2、C# 中的Socket參數

2.1 超時控制參數

  1. ReceiveTimeout:接收超時
socket.ReceiveTimeout = 5000; // 5秒(單位:毫秒)
// 超時拋出SocketException,ErrorCode為10060 (TimedOut)
  1. SendTimeout:發送超時
socket.SendTimeout = 3000; // 3秒
// 影響Send/SendTo操作
  1. BeginConnect:連接超時
// 通過Connect方法的異步版本實現
socket.BeginConnect(remoteEP, null, null);
if(!socket.Connected) {// 自定義超時邏輯
}

2.2 緩沖區參數

  1. ReceiveBufferSize:接收緩沖區大小
socket.ReceiveBufferSize = 65536; // 64KB
// 影響內核網絡棧的接收緩沖區
  1. SendBufferSize:發送緩沖區大小
socket.SendBufferSize = 32768; // 32KB
// 影響內核網絡棧的發送緩沖區

2.3 UDP專用參數

  1. EnableBroadcast:啟用廣播
udpSocket.EnableBroadcast = true;
// 允許發送到廣播地址(如255.255.255.255)
  1. 多播設置
// 加入多播組
udpSocket.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.AddMembership,new MulticastOption(IPAddress.Parse("224.0.0.1")));// 設置多播TTL
udpSocket.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.MulticastTimeToLive,2); // 最多跨越2個路由器

3、C# 中的Socket API

3.1 Socket(構造函數)

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

常見的 Socket 對象創建實例:

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

3.1.1 SocketType

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

SocketType對應的ProtocolType描述
UnknownUnknown指定未知的 Socket 類型
Stream(使用字節流)Tcp支持可靠、雙向、基于連接的字節流
Dgram(使用數據報)Udp面向無連接
RawIcmp、lgmp支持對基礎傳輸協議的訪問
Rdm支持無連接、面向消息、以可靠方式發送的消息,
Seqpacket在網絡上提供排序字節流的面向連接且可靠的雙向傳輸

3.1.2 ProtocolType

表示協議類型,是一個 enum 類型。
其中枚舉重復值,常見用途:

  • 為舊值提供別名
  • 向后兼容
  • 提供更清晰的命名選擇
枚舉值協議說明
Unknown-1未知協議類型
Unspecified0未指定的協議
IP0Internet 協議 (IP) - 原始 IP 數據包
IPv6HopByHopOptions0IPv6 逐跳選項頭
Icmp1Internet 控制消息協議 (ICMP)
Igmp2Internet 組管理協議 (IGMP)
Ggp3網關到網關協議 (GGP)
IPv44IPv4 協議
Tcp6傳輸控制協議 (TCP)
Pup12PARC 通用數據包協議 (PUP)
Udp17用戶數據報協議 (UDP)
Idp22Internet 數據報協議 (IDP)
IPv641IPv6 協議
IPv6RoutingHeader43IPv6 路由頭
IPv6FragmentHeader44IPv6 分片頭
IPSecEncapsulatingSecurityPayload50IPv6 封裝安全負載 (ESP) 頭
IPSecAuthenticationHeader51IPv6 認證頭 (AH)
IcmpV658ICMP for IPv6
IPv6NoNextHeader59IPv6 無下一個頭
IPv6DestinationOptions60IPv6 目的選項頭
ND77Net Disk 協議 (非正式)
Raw255原始 IP 數據包
Ipx1000Internet 數據包交換協議 (IPX)
Spx1256順序數據包交換協議 (SPX)
SpxII1257SPX 版本 2

3.1.3 AddressFamily

表示使用的網絡尋址方案

枚舉值協議說明使用場景
Unknown-1未知地址族保留值
Unspecified0未指定的地址族通用情況
Unix1Unix本地通信Unix域Socket
InterNetwork2IPv4地址族最常用的IPv4網絡
ImpLink3ARPANET IMP地址歷史遺留
Pup4PUP協議地址Xerox PUP網絡
Chaos5MIT CHAOS協議歷史遺留
NS6Xerox NS協議Xerox網絡系統
Ipx6IPX/SPX地址Novell網絡
Iso7ISO協議OSI協議族
Osi 7OSI協議同Iso
Ecma8ECMA協議歐洲計算機制造商協會
DataKit9Datakit協議AT&T Datakit
Ccitt 10CCITT協議TU-T協議
Sna11IBM SNA地址IBM系統網絡架構
DecNet12 DECnet地址Digital Equipment Corporation網絡
DataLink13直接數據鏈路接口數據鏈路層訪問
Lat14LAT地址Local Area Transport
HyperChannel15NSC HyperchannelNetwork Systems Corporation
AppleTalk16AppleTalk地址Apple網絡協議
NetBios17NetBios地址Windows網絡基本輸入輸出系統
VoiceView18VoiceView地址VoiceView音頻協議
FireFox19FireFox協議非標準協議
Banyan21Banyan VINESBanyan虛擬網絡系統
Atm22本機ATM服務異步傳輸模式
InterNetworkV623IPv6地址族IPv6網絡
Cluster24Microsoft WolfpackMicrosoft集群服務
Ieee1284425IEEE 1284.4工作組打印機共享協議
Irda26IrDA地址紅外數據協會
NetworkDesigners28Network Designers OSI網關網絡設計者協議
Max29最大地址族保留值

3.2 Bind()

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

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");serverSocket.Bind(new IPEndPoint(iP, 2300))

3.3 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);        //創建與遠程主機的連接
serverSocket.Connect(iPEndPoint);

3.4 Listen() (TCP)

監控所有發送到此主機的、特定端口的連接請求。服務端使用,客戶端不需要。

public void Listen (int backlog);

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

3.5 Accept() (TCP)

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

//創建終結點(EndPoint)
IPAddress ip = IPAddress.Any;             
IPEndPoint ipe = new IPEndPoint(ip, 8000);//創建 socket 并開始監聽
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(ipe);
serverSocket.Listen(10);//開始監聽//接受到client連接,為此連接建立新的socket,并接受信息
Socket temp = serverSocket.Accept();//為新建連接創建新的socket

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

3.6 Receive() 與 Send()

  • Receive() :接收信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = socket.Receive(recvBytes, recvBytes.Length, 0);//從客戶端接受信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
  • Send() :發送信息
string str = "hello";
byte[] a = Encoding.UTF8.GetBytes(str);
send = socket.Send(a, 0);

3.7 ReceiveFrom()與SendTo()

  • ReceiveFrom()
特性ReceiveReceiveFrom
連接要求需要已建立連接 (面向連接)無需預先連接 (無連接)
適用協議TCP UDP
來源獲取無法獲取發送方信息可獲取發送方的端點信息
方法簽名int Receive(byte[] buffer)int ReceiveFrom(byte[] buffer, ref EndPoint remoteEP)
典型用途可靠數據流傳輸數據報接收,特別是需要回復的場景
  • SendTo()
特性SendSendTo
連接要求需要已建立連接 (面向連接)無需預先連接 (無連接)
適用協議TCPUDP
目標指定在Connect時指定目標每次發送時指定目標
性能略高 (連接已建立)略低 (每次需解析地址)
可靠性高 (TCP保證送達和順序)低 (UDP不保證送達和順序)
方法簽名Send(byte[] buffer)SendTo(byte[] buffer, EndPoint remoteEP)

3.8 Shutdown()和Close()

釋放資源,有 Accept 釋放和 Socket 的釋放。

  • Shutdown()
    1. 向對方發送FIN包,啟動TCP的正常關閉握手流程
    2. 非破壞性操作,Socket對象仍然有效
    3. 允許完成正在進行的數據傳輸
    4. 遵循TCP協議的四次揮手過程
    5. 對方應用會收到EOF(Receive返回0)
public void Shutdown (System.Net.Sockets.SocketShutdown how);

SocketShutdown:

描述
Send禁止對此發送Socket
Receive禁用對此接收Socket
Both禁用發送和接收對此Socket
  • Close()
    1. 破壞性操作,Socket對象不再可用
    2. 可能丟失發送/接收緩沖區中的數據
    3. 對方可能收到ConnectionReset錯誤
    4. 立即釋放系統資源
  • 最佳實踐
void SafeClose(Socket socket)
{try{// 1. 先優雅關閉通信通道if(socket.Connected){socket.Shutdown(SocketShutdown.Both);}// 2. 設置linger選項確保數據發送socket.LingerState = new LingerOption(true, 5); // 等待5秒// 3. 最終釋放資源socket.Close();}catch(Exception ex){// 記錄日志Debug.WriteLine($"關閉Socket異常: {ex.Message}");// 確保資源釋放socket?.Close(); }
}

4、IPAddress 和 IPEndPoint

4.1 IPAddress

用來處理IP地址、轉換IP地址
IPAddress.Parse() 方法可以把以小數點隔分的十進制 IP 表示轉化成 IPAddress 類。

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

IPAddress提供4個只讀字段:

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

4.2 IPEndPoint

表示IPAddress對象與端口的綁定

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75468.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75468.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75468.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker部署ES集群

引言: Elasticsearch(ES)作為分布式搜索引擎,其核心價值在于通過集群部署實現高可用性和數據冗余。 本實驗對比兩種典型部署方案: 原生Linux部署:直接安裝ES服務,適用于生產環境,資…

老硬件也能運行的Win11 IoT LTSC (OEM)物聯網版

#記錄工作 Windows 11 IoT Enterprise LTSC 2024 屬于物聯網相關的版本。 Windows 11 IoT Enterprise 是為物聯網設備和場景設計的操作系統版本。它通常針對特定的工業控制、智能設備等物聯網應用進行了優化和定制,以滿足這些領域對穩定性、安全性和長期支持的需求…

【教程】xrdp修改遠程桌面環境為xfce4

轉載請注明出處:小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你,歡迎[點贊、收藏、關注]哦~ 目錄 xfce4 vs GNOME對比 配置教程 1. 安裝 xfce4 桌面環境 2. 安裝 xrdp 3. 配置 xrdp 使用 xfce4 4. 重啟 xrdp 服務 5. 配置防火墻&#xff…

【數據結構 · 初階】- 順序表

目錄 一、線性表 二、順序表 1.實現動態順序表 SeqList.h SeqList.c Test.c 問題 經驗:free 出問題,2種可能性 解決問題 (2)尾刪 (3)頭插,頭刪 (4)在 pos 位…

windows主機中構建適用于K8S Operator開發環境

基于win 10 打造K8S應用開發環境(wsl & kind) 一、wsl子系統安裝 1.1 確認windows系統版本 cmd/powershell 或者win r 運行winver 操作系統要> 19044 1.2 開啟wsl功能 控制面板 -> 程序 -> 啟用或關閉Windows功能 開啟適用于Linu…

計算機視覺色彩空間全解析:RGB、HSV與Lab的實戰對比

計算機視覺色彩空間全解析:RGB、HSV與Lab的實戰對比 一、前言二、RGB 色彩空間?2.1 RGB 色彩空間原理?2.1.1 基本概念?2.1.2 顏色混合機制? 2.2 RGB 在計算機視覺中的應用?2.2.1 圖像讀取與顯示?2.2.2 顏色識別?2.2.3 RGB 色彩空間的局限性? 三、HSV 色彩空…

PyTorch多GPU訓練實戰:從零實現到ResNet-18模型

本文將介紹如何在PyTorch中實現多GPU訓練,涵蓋從零開始的手動實現和基于ResNet-18的簡潔實現。代碼完整可直接運行。 1. 環境準備與庫導入 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l from torchvisio…

micro介紹

micro介紹 Micro 的首要特點是易于安裝(它只是一個靜態的二進制文件,沒有任何依賴關系)和易于使用Micro 支持完整的插件系統。插件是用 Lua 編寫的,插件管理器可自動為你下載和安裝插件。使用簡單的 json 格式配置選項&#xff0…

Linux內核分頁——線性地址結構

每個進程通過一個指針&#xff08;即進程的mm_struct→pgd&#xff09;指向其專屬的頁全局目錄&#xff08;PGD&#xff09;&#xff0c;該目錄本身存儲在一個物理頁框中。這個頁框包含一個類型為pgd_t的數組&#xff0c;該類型是與架構相關的數據結構&#xff0c;定義在<as…

微信小程序開發:微信小程序上線發布與后續維護

微信小程序上線發布與后續維護研究 摘要 微信小程序作為移動互聯網的重要組成部分,其上線發布與后續維護是確保其穩定運行和持續優化的關鍵環節。本文從研究學者的角度出發,詳細探討了微信小程序的上線發布流程、后續維護策略以及數據分析與用戶反饋處理的方法。通過結合實…

分享一些使用DeepSeek的實際案例

文章目錄 前言職場辦公領域生活領域學習教育領域商業領域技術開發領域 前言 以下是一些使用 DeepSeek 的實際案例&#xff1a; DeepSeek使用手冊資源鏈接&#xff1a;https://pan.quark.cn/s/fa502d9eaee1 職場辦公領域 行業競品分析&#xff1a;剛入職的小李被領導要求一天內…

flink iceberg寫數據到hdfs,hive同步讀取

目錄 1、組件版本 環境變量配置 2、hadoop配置 hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml 3、hive配置 hive-env.sh hive-site.xml HIVE LIB 原始JAR 4、flink配置集成HDFS和YARN 修改iceberg源碼 編譯iceberg-flink-runtime-1…

qq郵箱群發程序

1.界面設計 1.1 環境配置 在外部工具位置進行配置 1.2 UI界面設計 1.2.1 進入QT的UI設計界面 在pycharm中按順序點擊&#xff0c;進入UI編輯界面&#xff1a; 點擊第三步后進入QT的UI設計界面&#xff0c;通過點擊按鈕進行界面設計&#xff0c;設計后進行保存到當前Pycharm…

【C++游戲引擎開發】第10篇:AABB/OBB碰撞檢測

一、AABB(軸對齊包圍盒) 1.1 定義 ?最小點: m i n = ( x min , y min , z min ) \mathbf{min} = (x_{\text{min}}, y_{\text{min}}, z_{\text{min}}) min=(xmin?,ymin?,zmin?)?最大點: m a x = ( x max , y max , z max ) \mathbf{max} = (x_{\text{max}}, y_{\text{…

大模型是如何把向量解碼成文字輸出的

hidden state 向量 當我們把一句話輸入模型后&#xff0c;例如 “Hello world”&#xff1a; token IDs: [15496, 995]經過 Embedding Transformer 層后&#xff0c;會得到每個 token 的中間表示&#xff0c;形狀為&#xff1a; hidden_states: (batch_size, seq_len, hidd…

C++指針(三)

個人主頁:PingdiGuo_guo 收錄專欄&#xff1a;C干貨專欄 文章目錄 前言 1.字符指針 1.1字符指針的概念 1.2字符指針的用處 1.3字符指針的操作 1.3.1定義 1.3.2初始化 1.4字符指針使用注意事項 2.數組參數&#xff0c;指針參數 2.1數組參數 2.1.1數組參數的概念 2.1…

生命篇---心肺復蘇、AED除顫儀使用、海姆立克急救法、常見情況急救簡介

生命篇—心肺復蘇、AED除顫儀使用、海姆立克急救法、常見情況急救簡介 文章目錄 生命篇---心肺復蘇、AED除顫儀使用、海姆立克急救法、常見情況急救簡介一、前言二、急救1、心肺復蘇&#xff08;CPR&#xff09;&#xff08;1&#xff09;適用情況&#xff08;2&#xff09;操作…

基于神經環路的神經調控可增強遺忘型輕度認知障礙患者的延遲回憶能力

簡要總結 這篇文章提出了一種名為CcSi-MHAHGEL的框架&#xff0c;用于基于多站點、多圖譜fMRI的功能連接網絡&#xff08;FCN&#xff09;分析&#xff0c;以輔助自閉癥譜系障礙&#xff08;ASD&#xff09;的識別。該框架通過多視圖超邊感知的超圖嵌入學習方法&#xff0c;整合…

[WUSTCTF2020]level1

關鍵知識點&#xff1a;for匯編 ida64打開&#xff1a; 00400666 55 push rbp .text:0000000000400667 48 89 E5 mov rbp, rsp .text:000000000040066A 48 83 EC 30 sub rsp, 30h .text:000000…

cpp自學 day20(文件操作)

基本概念 程序運行時產生的數據都屬于臨時數據&#xff0c;程序一旦運行結束都會被釋放 通過文件可以將數據持久化 C中對文件操作需要包含頭文件 <fstream> 文件類型分為兩種&#xff1a; 文本文件 - 文件以文本的ASCII碼形式存儲在計算機中二進制文件 - 文件以文本的…