Scoket网络编程

1.首先来的个简单示例:

客户端:

using System;
using System.Net.Sockets;
using System.Net;
using System.Text;namespace Client
{internal class Program{static void Main(string[] args){Console.WriteLine("Client");// 创建一个Socket并连接到服务器IPAddress ipAddress = IPAddress.Parse("192.168.18.124");IPEndPoint remoteEP = new IPEndPoint(ipAddress, 22222);Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);sender.Connect(remoteEP);while (true){Console.WriteLine("请输入1或2");Console.WriteLine("1、发送数据:");Console.WriteLine("2、接受数据:");string v1 = Console.ReadLine();int v2 = Int32.Parse(v1);if (v2 == 1){Console.Write("请输入内容:");// 发送数据string v = Console.ReadLine();string message = "Hello from client!";byte[] msg = Encoding.Default.GetBytes(v);foreach(var a in msg){Console.WriteLine(a.ToString());}int bytesSent = sender.Send(msg);Console.WriteLine($"Sent: {v}");}else if (v2 == 2){// 接受数据byte[] buffer = new byte[1024];int bytesRec = sender.Receive(buffer);string data = Encoding.Default.GetString(buffer, 0, bytesRec);Console.WriteLine($"Received: {data}");}else{// 关闭连接sender.Shutdown(SocketShutdown.Both);sender.Close();Console.ReadKey();return;}             }   }}
}

服务端:

using System;
using System.Net.Sockets;
using System.Net;
using System.Text;namespace Server
{internal class Program{static void Main(string[] args){Console.WriteLine("Server!");// 创建一个用于监听的SocketSocket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 绑定IP地址和端口号IPAddress ipAddress = IPAddress.Parse("127.0.0.1");IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 22222);listener.Bind(localEndPoint);// 开始监听Console.WriteLine("Waiting for a connection...");listener.Listen(10);// 接受连接Socket handler = listener.Accept();Console.WriteLine($"Connected: {handler.RemoteEndPoint}");while (true){Console.WriteLine("请输入1或2");Console.WriteLine("1:表示读取数据");Console.WriteLine("2:表示发送数据");string v1 = Console.ReadLine();int flag = Int32.Parse(v1);         if(flag == 1){// 读取数据byte[] buffer = new byte[1024];int bytesRec = handler.Receive(buffer);string data = Encoding.Default.GetString(buffer, 0, bytesRec);Console.WriteLine($"Received: {data}");}else if(flag == 2){string v2 = Console.ReadLine();// 发送数据byte[] msg = Encoding.Default.GetBytes(v2);handler.Send(msg);}else{// 关闭连接handler.Shutdown(SocketShutdown.Both);handler.Close();return;}           }}}
}

 2.简单介绍Scoket:

        套接字(Socket),是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口,Socket所处的位置大概是下面这样的。

相关类方法

(1) IPAddress:包含了一个IP地址[提供 Internet 协议 (IP) 地址]

//这里的IP是long类型的,这里使用Parse()可以将string类型数据转成IPAddress所需要的数据类型
IPAddress IP = IPAddress.Parse();

(2) IPEndPoint:包含了一对IP地址和端口号

/*public IPEndPoint(IPAddress address, int port);*/
IPEndPoint endPoint = new IPEndPoint(ip,port);	//处理IP地址和端口的封装类

(3)Encoding.ASCII:编码转换

Encoding.ASCII.GetBytes()	//将字符串转成字节
Encoding.ASCII.GetString()	//将字节转成字符串

(4)获取当前时间

DateTime.Now.ToString("yy-MM-dd hh:mm:ss  ")

 3.服务端监听

        通常情况下,Socket服务器端的IP地址应该设置为一个有效的主机IP地址,以便服务器能够监听来自该特定IP地址的连接请求。要监听整个子网或多个设备,你可以将服务器的IP地址设置为该子网的默认网关或使用广播地址,或者使用通配符地址"0.0.0.0"来监听所有可用的网络接口。但是,请注意,具体的实现方式取决于你使用的编程语言和Socket库。

4.网段地址和网关概念:

1. **网段地址(Subnet Address)**:
   - 网段地址是一个网络的一部分,通常用于划分一个大的IP地址范围成为多个子网。每个子网都有自己的网段地址,用于标识该子网。
   - 网段地址是网络地址(Network Address)的一个同义词,它用于标识特定的IP地址范围,例如,"192.168.1.0/24"表示一个IP地址范围,其中最后一个字节(0-255)用于标识具体的设备。
   - 网段地址通常与子网掩码一起使用,以确定哪些部分的IP地址用于网络标识,哪些部分用于主机标识。

2. **网关(Gateway)**:
   - 网关是一个设备或路由器,它充当了一个网络中的出口点,允许网络中的设备与其他网络(通常是互联网)进行通信。
   - 当一个设备需要与不在同一个子网内的设备或网络通信时,它会将数据包发送到网关。网关会将数据包路由到正确的目标,然后将响应数据包返回给设备。
   - 在局域网中,通常有一个默认网关,用于处理大多数数据流量。默认网关的IP地址通常是子网中的第一个可用IP地址。

举例来说,假设你有一个局域网的IP地址范围是"192.168.1.0/24",其中"192.168.1.0"是网段地址,而"192.168.1.1"可能是默认网关的IP地址。在这个情况下,网关充当了连接局域网到其他网络(比如互联网)的出口点,而网段地址用于标识局域网内的IP地址范围。设备在需要与不同子网或外部网络通信时,将数据包发送给网关,由网关进行路由和转发。

5.网络相关知识

1.IP地址基本概念

IP地址

IP地址是主机的唯一标识,保证主机间正常通信。 是一种网络编码,用来确定网络中的节点。

IP地址是由32位二进制组成。通常被分割为4个“8位二进制数”(也就是4个字节)。分成4组,每组8位。子网掩码也是。例如:11000000.10000000.00000001.00000010 平时为了方便记忆,使用点分十进制格式。前面的二进制IP表示成十进制是:192.128.1.2。

二进制

8位二进制最小值 00000000 = 0 最大值 11111111=255

分类

IP地址分以下五类:

A类 : 从1.0.0.0 到126.255.255.255 ,适用于大型网络

B类 : 从128.0.0.0到191.255.255.255 ,适用于中型网络

C类 : 从192.0.0.0到223.255.255.255 ,适用于小型网络

D类 : 从224.0.0.0到239.255.255.255,用于组播

E类 : 从240.192.0.0.0到255.255.255.255,用于科研保留

A,B,C为常用类别。其中127.x.x.x段地址空间是被保留的回环地址

网络部分(网络地址)和主机部分(主机地址)

IP地址由2部分组成:网络部分+主机部分

IP地址=网络地址+主机地址

2.子网掩码

子网掩码又叫网络掩码、地址掩码、子网络遮罩。它是一种用来指明一个IP地址的哪些位 标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。

子网掩码也是一个32位地址,只有一个作用:就是将某个IP地址划分成网络地址和主机地址两部分。

①通过子网掩码,就可以判断两个IP在不在一个局域网内部。

②子网掩码可以看出有多少位是网络号,有多少位是主机号

③其对应的IP地址中网络地址的所有位置都为1,对应于主机地址的所有位置都为0。

每一类IP地址都有默认的子网掩码

对于A类地址来说,默认的子网掩码是255.0.0.0;

对于B类地址来说,默认的子网掩码是255.255.0.0;

对于C类地址来说,默认的子网掩码是255.255.255.0。

3.广播地址

广播地址(Broadcast Address)是专门用于同时向网络中所有工作站进行发送的一个地址。

在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址,广播的分组传送给host ID段所涉及的所有计算机。例如,对于10.1.1.0 (255.255.255.0 )网段,其广播地址为10.1.1.255 (255 即为2 进制的11111111 ),当发出一个目的地址为10.1.1.255 的分组(封包)时,它将被分发给该网段上的所有计算机。

4.子网划分

子网划分定义:Internet组织机构定义了五种IP地址,有A、B、C三类地址。A类网络有126个,每个A类网络可能有16777214台主机,它们处于同一广播域。而在同一广播域中有这么多节点是不可能的,网络会因为广播通信而饱和,结果造成16777214个地址大部分没有分配出去。可以把基于每类的IP网络进一步分成更小的网络,每个子网由路由器界定并分配一个新的子网网络地址,子网地址是借用基于每类的网络地址的主机部分创建的。划分子网后,通过使用掩码,把子网隐藏起来,使得从外部看网络没有变化,这就是子网掩码。

5.网络地址计算

①将IP地址和子网掩码换算为二进制,子网掩码连续全1的是网络地址,后面的是主机地址

②将子网掩码和IP地址按位进行逻辑“与”运算,得到IP地址的网络地址,剩下的部分就是主机地址,从而区分出任意IP地址中的网络地址和主机地址。

③将运算结果中的网络地址不变,主机地址变为1,结果就是广播地址

注:网络地址+1即为第一个主机地址,广播地址-1即为最后一个主机地址,

由此可以看出地址范围是: 网络地址+1 至 广播地址-1

示例

一个主机的IP地址是202.112.14.137,掩码是255.255.255.224,要求计算这个主机所在网络的网络地址和广播地址

子网掩码255.255.255.224 转二进制:11111111.11111111.11111111.11100000

其中网络位部分是27位,主机位部分是5位

网络地址就是:把IP地址转成二进制和子网掩码进行与运算

IP地址202.112.14.137转二进制:11001010 01110000 00001110 10001001

IP地址&子网掩码

11001010 01110000 00001110 10001001

11111111 11111111 11111111 11100000

11001010 01110000 00001110 10000000

注:与位运算:0与任何数运算为0,1与1运算为1

结果为:202.112.14.128

6.广播地址计算

网络地址的主机位全部变成1 ,10011111 即159 即:202.112.14.159

7.网络数计算

网络数=2的X次方(X是子网掩码中,借的1的个数)如:202.106.1.0/25 是一个C类地址借了一位。因为C类默认是/24嘛。所以X=1。网络数=2的1次方=2个。

8.主机数计算

主机数=2的Y次方-2(Y是子网掩码中0的个数)-2是掐头去尾,头是网络号,尾是广播地址。/25意味着子网掩码中有25个1,剩下32-25个0,也就是7个。所以主机数=2的7次方-2=126,也就是每个子网可以产生126个可以分配给主机使用的IP地址。

9.块大小计算

块大小=256-子网掩码:如:202.106.1.0/25 子网掩码=255.255.255.128 所以块大小=256-128=128。块大小知道了,网道络号就知了。因为,202.106.1.0/25 第一个网络号一定是202.106.1.0 第二个网络号就=202.106.1.0 + 128 =202.106.1.128。

于是得出:202.106.1.0/25 这个子网的网络号就是1.0第一个IP就是1.1,最后一个IP=下一个网络号-2=128-2=202.106.1.126。而202.106.1.127是第一网段的广播地址。

202.106.1.128/25 这个子网的网络号就是1.128 第一个IP就是1.129.最后一个IP就是1.254,而1.255是这个网段的广播地址。

ip段/数字-如192.168.0.1/24是什么意思?

后面数字24是告诉我们有多少网络位,也就是子网掩码中前有多少位1。即:子网掩码为11111111.11111111.11111111.00000000———255.255.255.0

示例:IP地址为202.106.1.0/26 求子网数(网络数)?主机数?网络地址?广播地址?

数字26告诉我们,IP地址的子网掩码为:11111111.11111111.11111111.11000000

这是一个C类地址,默认子网掩码为255.255.255.0。题目IP地址为:255.255.255.192,而网络位借用了主机位两个位置为1

所以:子网数(网络数)=2的X次方(X是子网掩码中,借的1的个数)=4

主机数=2的Y次方-2(Y是子网掩码中0的个数)=62

IP地址转换二进制:11001010.1101010.00000001.00000000

网络地址(网络号):202.106.1.0、202.106.64、202.106.1.128、202.106.1.192

广播地址:202.106.1.63、202.106.1.127、202.106.1.191、202.106.1.255

1.0、202.106.64、202.106.1.128、202.106.1.192

广播地址:202.106.1.63、202.106.1.127、202.106.1.191、202.106.1.255

6.给个网络小题

例如:我们先假定一个环境,一个小小的公司中,目前有5个部门A至E,其中:A部门有10台PC(电脑,主机),B部门20台,C部门30台,D部门15台,E部门20台,然后分配了一个总的网段192.168.2.0/24给你,作为网络管理者,你的任务是为每个部门划分单独的网段,你该怎样做呢?

分析:

根据题目,提炼已知条件得:

子网数<=5;主机数<=30;网段为C类地址;

由此我们知道该地址段的默认子网掩码为:

255.255.255.0;

转换为二进制得:(11111111.11111111.11111111.00000000)

而我们知道在进行子网划分时,是牺牲主机的数量来转换为子网数,因此,根据已知条件,以子网进行计算

解答:

假设,我们将n为主机二进制数转换为子网,则得:2n>=5(2的n次方>=5)

求得:n >=3,由此意味着我们将牺牲主机数量的三位二进制数转换为子网数:

子网掩码应为:(11111111.11111111.11111111.11100000)

255.255.255.224

为求证该子网结构是否符合要求,计算当前子网主机数应为25-2=30>=30(2的5次方减2) 符合要求。

同样,我们依据C类地址192.168.2.0可计算出在每个子网下的第一个IP地址和最后一个IP地址,它们分别是:

(1)255.255.255.32: 192.168.2.33~ 192.168.2.62

(2)255.255.255.64: 192.168.2.65~ 192.168.2.94

(3)255.255.255.96: 192.168.2.97~ 192.168.2.126

(4)255.255.255.128: 192.168.2.129~ 192.168.2.158

(5)255.255.255.160: 192.168.2.161~ 192.168.2.190

(6)255.255.255.192: 192.168.2.193~ 192.168.2.222

这个很抽象,不是一天几天可以理解的,慢慢的才能理解计算的网络。

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

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

相关文章

windows11 cmd使用python没有反应, windows11使用python跳应用商店

1. 修改系统变量位置&#xff0c;右击我的电脑&#xff0c;选择属性&#xff1a; 点击环境变量&#xff0c;找到path&#xff1a; 将python 的path移到windowsapp 上侧 保存退出。重新打开cmd&#xff0c;输入命令python -v

网络通信(套接字通信)(C/C++)

1.网络编程必知概念 1.广域网和局域网 广域网:又称外网、公网。是连接不同地区局域网或城域网进行计算机通信的远程公共网络。 局域网:在一定的通信范围内,有很个多计算机组成的私有网络就叫局域网。(这些计算机相互之间是可以通信的,但是不能直接访问外网(可以通过网线…

虹科方案 | LIN/CAN总线汽车零部件测试方案

文章目录 摘要一、汽车零部件测试的重要性&#xff1f;二、虹科的测试仿真工具如何在汽车零部件测试展露头角&#xff1f;三、应用场景**应用场景1&#xff1a;方向盘开关的功能测试****应用场景2&#xff1a;各类型电机的控制测试****应用场景3&#xff1a;RGB氛围灯的功能测试…

CISSP,你值得拥有(我的学习之路)

&#xff08;只分享三点&#xff1a;怎么学、怎么练、怎么考。&#xff09; 我为啥去考CISSP 我是个在信安行业摸爬滚打将近20年的老油条&#xff0c;知道CISSP这个认证是很早前的事情了&#xff0c;但一直以来都觉得它有点难&#xff0c;加上人又懒得要命&#xff0c;也就始…

安装elasticsearch

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: docker network create es-net 1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像,这个镜像体积非常大,接近1G。不建议大家自己pull。 课前资料提…

用selenium和xpath定位元素并获取属性值以及str字符型转json型

页面html如图所示&#xff1a; 要使用xpath定位这个div元素&#xff0c;并且获取其属性data-config的内容值。 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Optionshost127.0.0.1 port10808 …

Serlet API详解

目录 一、HttpServlet 1.1 处理doGet请求 1.2 处理doPost请求 二、HttpServletRequest 2.1 核心方法 三、HttpServletRespons 3.1 核心方法 一、HttpServlet 在编写Servlet代码的时候&#xff0c;首先第一步要做的就是继承HttpServlet类&#xff0c;并重写其中的某些方法 核心…

最新ChatGPT网站系统源码+支持GPT4.0+支持AI绘画Midjourney绘画+支持国内全AI模型

一、SparkAI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&a…

前端知识总结

在前端开发中&#xff0c;y x是一种常见的自增运算符的使用方式。它表示将变量x的值自增1&#xff0c;并将自增后的值赋给变量y。 具体来说&#xff0c;x是一种后缀自增运算符&#xff0c;表示将变量x的值自增1。而y x则是将自增前的值赋给变量y。这意味着在执行y x之后&am…

文件夹无法删除怎么办?4种实用方法,轻松解决

在日常使用电脑时&#xff0c;有时候会碰到无法删除文件夹的情况&#xff0c;这可能会带来一些困扰。如果你想删除一个文件夹却发现无法删除&#xff0c;不必担心&#xff0c;其实是有解决方法的。下面一起来了解下文件夹不能删除的原因以及解决方法吧。 文件夹为什么不能删除…

编程每日一练(多语言实现):判断偶数

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现 一、实例描述 利用单条件单分支选择语句判断输入的一个整数 是否是偶数。 运行程序&#xff0c;输入一个 整数18&#xff0c; 然后按回车键&#xff0c;将提示该数字是偶数…

深入理解React中fiber

一、前言 Fiber是对React核心算法的重写&#xff0c;Fiber是React内部定义的一种数据结构&#xff0c;将更新渲染耗时长的大任务&#xff0c;分为许多的小片。Fiber节点保存啦组件需要更新的状态和副作用&#xff0c;一个Fiber代表一个工作单元。 二、Fiber在React做了什么 …

【文末送书】用Chat GPT轻松玩转机器学习与深度学习

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

华南理工大学电子与信息学院23年预推免复试面试经验贴

运气较好&#xff0c;复试分数90.24&#xff0c;电科学硕分数线84、信通83、专硕电子与信息74. 面试流程&#xff1a; 1&#xff1a;5min ppt的介绍。其中前2min用英语简要介绍基本信息&#xff0c;后3min可用英语也可用中文 介绍具体项目信息如大创、科研、竞赛等&#xff08…

Android 遍历界面所有的View

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、实践四、 推荐阅读 一、导读 我们…

linux使用操作[2]

文章目录 版权声明网络传输ping命令wget命令curl命令端口linux端口端口命令和工具 进程管理查看进程关闭进程 主机状态top命令内容详解磁盘信息监控 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相…

MySQL - 全表分组后,获取组内排序首条数据信息

性能 不详!!! 不详!!! 不详!!! 请谨慎使用!!!环境 MySQL服务: 8.0版本;思路 使用8.0版本的新函数特性: row_number(): 序号函数; 顾名思义, 就是给每组中的元素从1开始按顺序加上序号;over(): 其中两个语法如下 partition: 按某字段分组;order by: 按某字段排序;注意: 两函数详…

算法通过村第十关-快排|白银笔记|快排实战

一个程序员一生中可能会邂逅各种各样的算法&#xff0c;但总有那么几种&#xff0c;是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓&#xff01;”算法吧~ 文章目录 前言数组第K大总结 前言 这是快排中的经典算法题&#xff0c;但是很多…

数据库:Hive转Presto(一)

本人因为工作原因&#xff0c;经常使用hive以及presto&#xff0c;一般是编写hive完成工作&#xff0c;服务器原因&#xff0c;presto会跑的更快一些&#xff0c;所以工作的时候会使用presto验证结果&#xff0c;所以就要频繁hive转presto&#xff0c;为了方便&#xff0c;我用…

php函数usort使用方法

在 PHP 中&#xff0c;usort() 函数用于对数组进行排序&#xff0c;它允许你使用自定义的比较函数来确定元素的顺序。以下是 usort() 函数的使用方法&#xff1a; usort(array &$array, callable $cmp_function): bool参数说明&#xff1a; $array&#xff1a;要排序的数…