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!");
            // 创建一个用于监听的Socket
            Socket 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

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值