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.mzph.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码形式存储在计算机中二进制文件 - 文件以文本的…