(一)CSharp-Socket

news2024/12/23 13:43:08

一、套接字

请添加图片描述

Windows Sockets 只支持一个通信域:网际域(AF-INET),这个域被使用网际协议族通信的进程所使用。

TCP/IP 的 Socket 则提供3种类型的套接字

1、流式套接字(SOCK_STREAM)
提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传输协议(FTP)即使用流式套接字。

2、数据报式套接字(SOCK_DGRAM)
提供无连接服务。数据包以独立包形式发送,不提供无差错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。

3、原始套接字(SOCK_RAW)
该接口允许对较低层协议,如 IP、ICMP 直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。

二、C/S 编程模式

通信的两个进程间相互作用的主要模式式客户机/服务器模式。
客户端: 请求另一台计算机上的服务(如访问数据库)的计算机。
服务端: 处理这些服务请求(例如对数据库进行检索,将结果返回)的计算机。

对称协议: 每一方都有可能扮演主从角色。
非对称协议: 一方被不可改变的认为是主机,而另一方则是从机。

三、Socket 编程的通信方式

1)同步方法
通信的同步,指客户端在发送请求后,必须在服务端有回应后才能发送下一个请求。所以这个时候的所有请求将会在服务端得到同步。

(2)异步方法
通信的异步,指客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求,这样对于所有的请求动作来说将会在服务端得到异步,这条请求的链路就像是一个请求队列,所有的动作在这里不会得到同步。

3)阻塞方式
阻塞套接字是指执行此套接字的网络调用时,所调用的函数只有在得到结果之后才会返回,在调用结果返回之前,当前线程会被挂起,即此套接字一直阻塞在网络调用上。比如调用 StreamReader 类的 ReadLine() 方法读取网络缓冲区的数据,如果调用的时候没有数据到达,那么此 ReadLine() 方法将一直挂在调用上,直到读到一些数据,此函数才返回。

(4)非阻塞方法
非阻塞套接字是指在执行此套接字的网络调用时,即使不能立刻得到结果,该函数也不会阻塞当前线程,而会立刻返回。对于非阻塞套接字,同样调用 StreamReader 类的 ReadLine() 方法读取网络缓冲区的数据,不管是否读取数据都立即返回,而不会一直挂在此函数调用上。

阻塞对象上可以有非阻塞的调用方式,可以通过一定的 API 去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。

客户端/服务端结构的软件采用的方式就是异步非阻塞模式。在利用 C# 进行网络编程时,由于 .NET Framework SDK 对阻塞和非阻塞的工作机制进行了封装。

四、.NET 中的 Socket 类

1、Socket 类

1)TCP Socket:

请添加图片描述

2)UDP Socket:

请添加图片描述

Socket 类的构造函数原型:

public Socket(
AddressFamily addressFamily,//对于常规 IP 通信网络,只能使用 AddressFamily.InterNetwork。
SoncketType socketType,
ProtocolType protocolType
);

AddressFamily: 用来指定网络类型;
SoncketType: 用来指定套接字类型(即数据连接方法)
ProtocolType: 用来指定网络协议。

表- IP 套接字定义组合

SocketType 值ProtocolType 值描述
StreamTcp面向连接套接字
DgramUdp无连接套接字
RawIcmp网际消息控制协议套接字
RawRaw基础传输协议套接字

表- Socket 类的公共属性

属性名描述
AddressFaimly获取 Socket 的地址族
Available获取已经从网络接收且可供读取的数据量
Blocking获取或设置一个值,该值指示 Socket 是否处于阻塞模式
Connected获取一个值,该值指示 Socket 是否已连接到远程主机
Handle获取 Socket 的操作系统句柄
LocalEndPoint获取本地终结点 EndPoint
RemoteEndPoint获取远程终结点 EndPoint
ProtocolType获取 Socket 的协议类型
SocketType获取 Socket 的类型

2、Socket 类的常用方法

(1)Bind(EndPoint adddress)
在服务器端,当一个套接字被创建后,需要将它绑定到系统的一个特定地址。可以使用 Bind() 方法来完成,其参数为一个 IPEndPoint 实例(包含 IP 地址和端口信息)。

(2)Listen(int con_num)
服务器端的套接字完成了与地址的绑定后,就使用 Listen() 方法监听客户发送的连接请求。其参数 con_num 为一整型值,该值表示服务器可以接收的最大连接数目。超过这个数目的连接都会被拒绝。con_num 数值的设定会影响到服务器的运行,因为每个接受的连接都要使用 TCP 缓冲区,如果连接的数目过大,收发数据的缓存将减少。

(3)Accept()
在服务器进入监听状态时,如有从客户端发来的连接请求,服务器将使用 Accept() 方法来接受连接请求。 Accept() 返回一个新的套接字,该套接字包含所建立的连接的信息并负责处理本连接的所有通信。而服务器刚开始创建的套接字仍然负责监听,并在需要时调用 Accept() 接受新的连接请求。

(4)Send()
当服务器接受了来自客户端的连接请求后,服务器和客户端双方就可以利用 Send() 方法来发送数据。

表-Send()、Receive() 重载方法

方法说明
Send(byte[] data)将数据发送到连接的 Socket
Send(byte[] data, SocketFlags sf)使用指定的 SocketFlags 将数据发送到连接的 Socket
Send(byte[] data , int size, SocketFlags sf)使用指定的 SocketFlags,将指定字节数的数据发送到已连接的 Socket
Send(byte[] data, int offset, int size, SocketFlags sf)使用指定的 SocketFlags,将指定字节数的数据发送到已连接的 Socket(从指定的偏移量开始)
Receive(byte[] data)从绑定的套接字接收数据,将数据存入接收缓冲区
Receive(byte[] data, SocketFlags sf)使用指定的 SocketFlags,从绑定的套接字接收数据,将数据存入接收缓冲区
Receive(byte[] data, int size, SocketFlags sf)使用指定的 SocketFlags,从绑定的套接字接收指定字节数的数据,并将数据存入接收缓冲区
Receive(byte[] data , int pffset, int size, SocketFlags sf)使用指定的 SocketFlags,从绑定的套接字接收指定字节数的数据,并将数据存入接收缓冲区的指定偏移量位置

(5)Receive()
当服务器接受了来自客户端的连接请求后,服务器和客户端双方就可以利用 Receive() 方法来接受数据。

(6) Connect(EndPoint remoteEP)
同服务器端一样,客户端的套接字建立后也必须与一个地址绑定。在客户端使用 Connect() 方法实现绑定,remoteEP 参数为索要连接的服务器端的 IPEndPoint 实例。调用 Connect() 方法后,它将一直阻塞到连接建立,如果连接不成功,将返回一个异常。

(7)Shutdown(SocketShutdown how)
当客户端和服务器端的通信结束时,必须关闭相应的套接字实例。可以使用 Shutdown() 方法来禁止该套接字上的发送和接收,Shutdown() 方法有一个枚举类型的参数,如 SocketShutdown.Send 表示禁用发送套接字,SocketShutdown.Receive 表示禁用接收套接字,SocketShutdown.Both 表示禁用发送和接收的套接字。

(8)Close()
禁止套接字上的发送和接收之后,使用 Close() 方法关闭套接字连接并释放所有相关资源。这样套接字会在系统内部缓冲区处理完毕后套接字并释放资源。

代码例子

        static void Main(string[] args)
        {
            //创建 IPEndPoint 实例
            IPAddress ipa = IPAddress.Parse("127.0.0.1");
            IPEndPoint ipep = new IPEndPoint(ipa, 8080);
            //创建 Socket 实例
            Socket test_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Console.WriteLine("AddressFamily:{0}", test_socket.AddressFamily);
            Console.WriteLine("SocketType:{0}", test_socket.SocketType);
            Console.WriteLine("ProtocolType:{0}", test_socket.ProtocolType);
            Console.WriteLine("Blocking:{0}", test_socket.Blocking);
            //修改 Socket 实例的属性
            test_socket.Blocking = false;
            Console.WriteLine("new Blocking:{0}", test_socket.Blocking);
            Console.WriteLine("Connected:{0}", test_socket.Connected);
            //调用 Bind() 方法,使 Socket 与一个本地终结点相关联
            test_socket.Bind(ipep);
            IPEndPoint sock_iep = (IPEndPoint)test_socket.LocalEndPoint;
            Console.WriteLine("Local EndPoint:{0}", sock_iep.ToString());
            //关闭 Socket
            test_socket.Close();

            Console.ReadKey();
        }

输出结果:

AddressFamily:InterNetwork
SocketType:Stream
ProtocolType:Tcp
Blocking:True
new Blocking:False
Connected:False
Local EndPoint:127.0.0.1:8080

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/686634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32 Proteus仿真闹钟设定万年历系统DS1302北京时间LCD1602蜂鸣器报警-0045

STM32 Proteus仿真闹钟设定万年历系统DS1302北京时间LCD1602蜂鸣器报警-0045 Proteus仿真小实验: STM32 Proteus仿真闹钟设定万年历系统DS1302北京时间LCD1602蜂鸣器报警-0045 功能: Protues版本:8.9 硬件组成:STM32F103R6单…

gif格式怎么转换成mp4? 这两个方法实用方便!

GIF(Graphics Interchange Format)文件是一种常见的动态图像格式,而MP4(MPEG-4 Part 14)则是一种流行的视频文件格式。有时候,您可能想要将GIF文件转换为MP4格式,以便在不同的平台和设备上进行更…

6-js基础-5

JavaScript 基础 - 5 知道对象数据类型的特征,能够利用数组对象渲染页面 对象综合案例数据类型存储 对象 对象(Object):JavaScript里的一种数据类型(引用类型),也是用于存储数据的 好处&#x…

机器学习笔记 - 了解机器学习中的小样本(Few-Shot)学习

一、背景概述 深度学习模型在图像分类、语义分割、对象检测等计算机视觉任务中的成功归功于利用了用于训练网络的大量标记数据——一种称为监督学习的方法。尽管在这个信息技术时代有大量的非结构化数据可用,但注释数据很难获得。 由于这个原因,计算机视觉机器学习项目中数据…

python spider 爬虫 之 urllib系列 urlretrieve下载照片、视频 网页

python 中 集成了 urllib urllib import urllib.request # urlopen 方法 url"url" response urllib.request.urlopen(url)print(type(response )) print(response.read()) # 解码 字节--->字符串 decode 字符串--》字节 encode print(response.read()…

腾讯课堂Python课程哪家强?

腾讯课堂Python课程哪家强? 文章目录 腾讯课堂Python课程哪家强?一、前言二、数据读取和数据预处理1、数据读取2、数据处理 三、有多少人愿意花钱学Python?四、多少价位的课买的人最多?五、哪家机构的课最多?销量最好&…

来评选你心中的TOP1编程语言

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

WEBGIS系统数据库设计

文章目录 系统设备模型设计1 .设备模型结构2. 设备逻辑关系模型系统属性数据库设计1 . 系统属性数据库2 . 实体继承关系1) 电气实体部分2 )土建实体部分3 )其他实体联系 系统采用PostgreS QL 作为属性数据库, PostGIS 作为空间数据库&#xf…

CENTOS上的网络安全工具(二十六)SPARK+NetSA Security Tools容器化部署(2)

〇、抓包与批量转换cap文件 1. Network Monitor 抓包 我们在CENTO OS上的网络安全工具(十七)搭建Cascade的Docker开发环境中捎带脚介绍了以下windows下的抓包软件。大意就是微软又一款不错的抓包分析软件,名曰nmcap,可在Download …

MySQL——备份与恢复

文章目录 MySQL 完全备份物理冷备份与恢复mysqldump 备份与恢复 MySQL 完全恢复MySQL 增量备份与恢复MySQL 增量备份MySQL 增量恢复 MySQL 完全备份 InnoDB存储引擎的数据库在磁盘上存储成三个文件:db.opt(表属性文件)、表名.frm(表结构文件)、表名.ibd(表数据文件…

FPGA解码 4K MIPI 视频 纯vhdl实现 CSI2 RX 采集OV13850,提供工程源码和技术支持

目录 1、前言2、Xilinx官方主推的MIPI解码方案3、本方案的性能及其优越性4、我这里已有的 MIPI 编解码方案5、vivado工程介绍6、上板调试验证7、福利:工程代码的获取 1、前言 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解…

本地部署开源大模型的完整教程:LangChain + Streamlit+ Llama

在过去的几个月里,大型语言模型(llm)获得了极大的关注,这些模型创造了令人兴奋的前景,特别是对于从事聊天机器人、个人助理和内容创作的开发人员。 大型语言模型(llm)是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型…

【FreeRTOS】Arduino开发STM32

0.开发环境(工具) Vscode 、platformio、arduino、STM32F103C8T6、USB-TTL 引脚连接:STM32直接设置为烧录模式即可,烧录完成后会自动运行程序。 1.点灯加串口输出调试 注意事项:每次上传程序前,需要按一下复位键。 #include &…

【Linux】2、文件系统、Rootfs

文章目录 一、文件系统二、Rootfs2.1 各目录约定2.1.1 /bin4.2 /boot4.3 /dev4.4 /etc4.5 /home4.6 /lib4.7 /media4.8 /mnt4.9 /opt4.10 /root4.11 /run4.12 /sbin4.13 /srv4.14 /tmp4.15 /usr4.16 /var 一、文件系统 Linux 的文件系统遵循 HFS 设计,有如下实现&a…

浅谈充电桩监控系统的必要性

关注acrelzxz,了解更多详情 摘要:针对当前电动汽车续航能力严重不足以及不能及时充电的问题,将电力电子变流技术、智能监控技术、REIP无线射频技术及CAN总线技术应用到电动汽车智能充电桩的设计与研究中。开展了无人值守的智能电动车充电桩的…

Android 使用webView打开网页可以实现自动播放音频

使用webview 自动播放音视频,场景如,流媒体自动部分,音视频通话等。会出现如下问题: 解决方案如下: 配置webview 如下,这样可以自动播放音频。 webView.getSettings().setMediaPlaybackRequiresUserGestur…

如何从视频里面提取音频,这4个方法非常好用!

今天,我要介绍4种提取视频中音频的方法,每一种都非常简单方便,让你轻松获取视频中的音频! 1.音视频分离 这是最简单直接的方法之一,你可以使用视频编辑软件将视频导入,并对其进行音频分离,就可…

[Spring Boot Starter系列]Spring Boot自动装配原理

目录 一、介绍 二、Spring Boot实现自动装配的简单流程(基于2.3.5.RELEASE版本) 三、总结 一、介绍 什么是Spring Boot的自动装配? 以下描述部分来自Spring Boot官网: Spring Boot自动配置尝试根据您添加的jar依赖项自动配置您…

《kafka 核心技术与实战》课程学习笔记(八)

无消息丢失配置怎么实现? Kafka 只对“已提交”的消息(committed message)做有限度的持久化保证。 第一个核心要素是“已提交的消息”。 当 Kafka 的若干个 Broker 成功地接收到一条消息并写入到日志文件后,它们会告诉生产者程序…

机器学习4:基本术语

机器学习涉及很多专业术语,为了避免混淆概念,我们在学习中,首先必须统一语言:即充分理解专业术语,并采用专业术语来描述机器学习相关的内容。本节将介绍几种基本的机器学习术语。 目录 1.标签 2.特征 3.示例 4.模…