实用指南:开源 C# 快速开发(十四)进程--内存映射

news/2025/10/4 8:08:43/文章来源:https://www.cnblogs.com/yxysuanfa/p/19125259

         文章的目的为了记录使用C# 开发学习的经历。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

 相关链接:

开源 C# 快速开发(一)基础知识

开源 C# 快速开发(二)基础控件

开源 C# 快速开发(三)复杂控件

开源 C# 快速开发(四)自定义控件--波形图

开源 C# 快速开发(五)自定义控件--仪表盘

开源 C# 快速开发(六)自定义控件--圆环

开源 C# 快速开发(七)通讯--串口

开源 C# 快速开发(八)通讯--Tcp服务器端

开源 C# 快速开发(九)通讯--Tcp客户端

开源 C# 快速开发(十)通讯--http客户端

开源 C# 快速开发(十一)线程

开源 C# 快速开发(十二)进程监控

开源 C# 快速开发(十三)进程--管道通讯

开源 C# 快速开发(十四)进程--内存映射

开源 C# 快速开发(十五)进程--windows消息

开源 C# 快速开发(十六)数据库--sqlserver增删改查

推荐链接:

开源 C# .net mvc 开发(一)WEB搭建_c#部署web程序-CSDN博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-CSDN博客

开源 C# .net mvc 开发(三)WEB内外网访问-CSDN博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示-CSDN博客

开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-CSDN博客

开源 C# .net mvc 开发(六)发送邮件、定时以及CMD编程-CSDN博客

开源 C# .net mvc 开发(七)动态图片、动态表格和json数据生成-CSDN博客

开源 C# .net mvc 开发(八)IIS Express轻量化Web服务器的配置和使用-CSDN博客

开源 C# .net mvc 开发(九)websocket--服务器与客户端的实时通信-CSDN博客

本章节主要内容是:内存映射文件在C#进程间进行的数据通信,服务器端和客户端之间的通讯。

内存映射文件(Memory-Mapped Files)是一种将磁盘文件或共享内存区域直接映射到进程虚拟地址空间的技术。通过这种技术,应用程序可以像访问普通内存一样访问文件内容,而无需使用传统的文件I/O操作。

目录:

1.源码分析

2.所有源码

3.效果演示

一、源码分析

服务器端代码分析

1. 服务器初始化 InitializeServer()

private void InitializeServer()
{
    try
    {
        // 创建或打开内存映射文件
        mmf = MemoryMappedFile.CreateOrOpen(MapName, Capacity);
        accessor = mmf.CreateViewAccessor();
        // 初始化共享内存:在位置0写入0(数据长度)
        accessor.Write(0, 0);
        // 启动读取线程
        isRunning = true;
        readThread = new Thread(ReadFromSharedMemory);
        readThread.IsBackground = true;  // 设为后台线程,主线程退出时自动终止
        readThread.Start();
        UpdateStatus("服务器已启动 - 等待客户端连接...");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"服务器启动失败: {ex.Message}");
    }
}


关键点:

CreateOrOpen:如果文件不存在则创建,存在则打开

前4字节用于存储数据长度,初始化为0

启动后台线程持续监听消息

2. 读取线程函数 ReadFromSharedMemory()

private void ReadFromSharedMemory()
{
    while (isRunning)  // 循环直到停止标志为false
    {
        try
        {
            // 读取前4字节获取数据长度
            int dataLength = accessor.ReadInt32(0);
            if (dataLength > 0)  // 有数据需要读取
            {
                // 读取实际数据(从第4字节开始)
                byte[] buffer = new byte[dataLength];
                accessor.ReadArray(4, buffer, 0, dataLength);
                string receivedMessage = Encoding.UTF8.GetString(buffer);
                // 在UI线程上安全更新界面
                Invoke(new Action(() =>
                {
                    lstReceivedMessages.Items.Add($"[{DateTime.Now:HH:mm:ss}] 收到: {receivedMessage}");
                    lstReceivedMessages.TopIndex = lstReceivedMessages.Items.Count - 1;
                }));
                // 清空数据长度标记,表示数据已处理
                accessor.Write(0, 0);
            }
            Thread.Sleep(100); // 降低CPU使用率
        }
        catch (ThreadAbortException)
        {
            break;  // 线程被中止时退出循环
        }
        catch (Exception ex)
        {
            // 在UI线程显示错误信息
            Invoke(new Action(() =>
                UpdateStatus($"读取错误: {ex.Message}")));
            Thread.Sleep(1000);
        }
    }
}


数据格式:text
[0-3字节] 数据长度 (int32)
[4-...字节] 实际数据 (UTF-8编码的字符串)


3. 发送消息 SendMessage(string message)

private void SendMessage(string message)
{
    if (string.IsNullOrWhiteSpace(message))
    {
        MessageBox.Show("请输入要发送的消息");
        return;
    }
    try
    {
        // 将字符串转换为字节数组
        byte[] buffer = Encoding.UTF8.GetBytes(message);
        int dataLength = buffer.Length;
        // 检查消息长度是否超出容量
        if (dataLength > Capacity - 4) // 减去存储长度的4字节
        {
            MessageBox.Show("消息太长,无法发送");
            return;
        }
        // 写入数据:先写长度,再写数据
        accessor.Write(0, dataLength);
        accessor.WriteArray(4, buffer, 0, dataLength);
        // 更新发送历史
        lstSentMessages.Items.Add($"[{DateTime.Now:HH:mm:ss}] 发送: {message}");
        lstSentMessages.TopIndex = lstSentMessages.Items.Count - 1;
        txtMessage.Clear();
        txtMessage.Focus();
    }
    catch (Exception ex)
    {
        MessageBox.Show($"发送失败: {ex.Message}");
    }
}



4. 事件处理函数
btnSend_Click

private void btnSend_Click(object sender, EventArgs e)
{
    SendMessage(txtMessage.Text);  // 调用发送消息函数
}


txtMessage_KeyPress

private void txtMessage_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Enter)  // 按Enter键发送
    {
        btnSend_Click(sender, e);
        e.Handled = true;  // 阻止系统处理Enter键
    }
}


ServerForm_FormClosing

private void ServerForm_FormClosing(object sender, FormClosingEventArgs e)
{
    isRunning = false;           // 设置停止标志
    readThread?.Join(1000);      // 等待读取线程结束,最多等待1秒
    // 释放资源
    accessor?.Dispose();
    mmf?.Dispose();
}



5. 辅助函数 UpdateStatus(string status)

private void UpdateStatus(string status)
{
    lblStatus.Text = status;  // 更新状态标签
}



客户端代码分析
客户端的函数与服务器端非常相似,主要区别在于初始化部分:

1. 客户端初始化 InitializeClient()

private void InitializeClient()
{
    try
    {
        // 连接到现有的内存映射文件(必须已由服务器创建)
        mmf = MemoryMappedFile.OpenExisting(MapName);
        accessor = mmf.CreateViewAccessor();
        isRunning = true;
        readThread = new Thread(ReadFromSharedMemory);
        readThread.IsBackground = true;
        readThread.Start();
        UpdateStatus("客户端已连接");
    }
    catch (FileNotFoundException)
    {
        MessageBox.Show("服务器未启动,请先启动服务器端程序");
        UpdateStatus("连接失败 - 服务器未启动");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"客户端启动失败: {ex.Message}");
        UpdateStatus($"连接失败: {ex.Message}");
    }
}


关键区别:

使用 OpenExisting 而不是 CreateOrOpen

需要处理 FileNotFoundException(服务器未启动的情况)

二、所有源码

ServerForm.cs文件源码

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace MemoryMappedFileDemo
{public partial class ServerForm : Form{private MemoryMappedFile mmf;private MemoryMappedViewAccessor accessor;private const string MapName = "MySharedMemory";private const int Capacity = 1024; // 1KB共享内存private Thread readThread;private bool isRunning = false;public ServerForm(){InitializeComponent();InitializeServer();}private void InitializeServer(){try{// 创建内存映射文件mmf = MemoryMappedFile.CreateOrOpen(MapName, Capacity);accessor = mmf.CreateViewAccessor();// 初始化共享内存accessor.Write(0, 0); // 写入数据长度isRunning = true;readThread = new Thread(ReadFromSharedMemory);readThread.IsBackground = true;readThread.Start();UpdateStatus("服务器已启动 - 等待客户端连接...");}catch (Exception ex){MessageBox.Show($"服务器启动失败: {ex.Message}");}}private void ReadFromSharedMemory(){while (isRunning){try{// 读取数据长度int dataLength = accessor.ReadInt32(0);if (dataLength > 0){// 读取实际数据byte[] buffer = new byte[dataLength];accessor.ReadArray(4, buffer, 0, dataLength);string receivedMessage = Encoding.UTF8.GetString(buffer);// 在UI线程上更新接收到的消息Invoke(new Action(() =>{lstReceivedMessages.Items.Add($"[{DateTime.Now:HH:mm:ss}] 收到: {receivedMessage}");lstReceivedMessages.TopIndex = lstReceivedMessages.Items.Count - 1;}));// 清空数据长度标记,表示数据已读取accessor.Write(0, 0);}Thread.Sleep(100); // 降低CPU使用率}catch (ThreadAbortException){break;}catch (Exception ex){Invoke(new Action(() =>UpdateStatus($"读取错误: {ex.Message}")));Thread.Sleep(1000);}}}private void btnSend_Click(object sender, EventArgs e){SendMessage(txtMessage.Text);}private void SendMessage(string message){if (string.IsNullOrWhiteSpace(message)){MessageBox.Show("请输入要发送的消息");return;}try{byte[] buffer = Encoding.UTF8.GetBytes(message);int dataLength = buffer.Length;if (dataLength > Capacity - 4) // 减去存储长度的4字节{MessageBox.Show("消息太长,无法发送");return;}// 写入数据长度和实际数据accessor.Write(0, dataLength);accessor.WriteArray(4, buffer, 0, dataLength);lstSentMessages.Items.Add($"[{DateTime.Now:HH:mm:ss}] 发送: {message}");lstSentMessages.TopIndex = lstSentMessages.Items.Count - 1;txtMessage.Clear();txtMessage.Focus();}catch (Exception ex){MessageBox.Show($"发送失败: {ex.Message}");}}private void UpdateStatus(string status){lblStatus.Text = status;}private void ServerForm_FormClosing(object sender, FormClosingEventArgs e){isRunning = false;readThread?.Join(1000);accessor?.Dispose();mmf?.Dispose();}private void txtMessage_KeyPress(object sender, KeyPressEventArgs e){if (e.KeyChar == (char)Keys.Enter){btnSend_Click(sender, e);e.Handled = true;}}#region Windows Form Designer generated codeprivate System.ComponentModel.IContainer components = null;private TextBox txtMessage;private Button btnSend;private ListBox lstReceivedMessages;private ListBox lstSentMessages;private Label lblStatus;private Label label1;private Label label2;private Label label3;protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}private void InitializeComponent(){this.txtMessage = new System.Windows.Forms.TextBox();this.btnSend = new System.Windows.Forms.Button();this.lstReceivedMessages = new System.Windows.Forms.ListBox();this.lstSentMessages = new System.Windows.Forms.ListBox();this.lblStatus = new System.Windows.Forms.Label();this.label1 = new System.Windows.Forms.Label();this.label2 = new System.Windows.Forms.Label();this.label3 = new System.Windows.Forms.Label();this.SuspendLayout();// txtMessagethis.txtMessage.Location = new System.Drawing.Point(12, 30);this.txtMessage.Name = "txtMessage";this.txtMessage.Size = new System.Drawing.Size(300, 20);this.txtMessage.TabIndex = 0;this.txtMessage.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtMessage_KeyPress);// btnSendthis.btnSend.Location = new System.Drawing.Point(318, 28);this.btnSend.Name = "btnSend";this.btnSend.Size = new System.Drawing.Size(75, 23);this.btnSend.TabIndex = 1;this.btnSend.Text = "发送";this.btnSend.UseVisualStyleBackColor = true;this.btnSend.Click += new System.EventHandler(this.btnSend_Click);// lstReceivedMessagesthis.lstReceivedMessages.FormattingEnabled = true;this.lstReceivedMessages.HorizontalScrollbar = true;this.lstReceivedMessages.Location = new System.Drawing.Point(12, 80);this.lstReceivedMessages.Name = "lstReceivedMessages";this.lstReceivedMessages.Size = new System.Drawing.Size(381, 160);this.lstReceivedMessages.TabIndex = 2;// lstSentMessagesthis.lstSentMessages.FormattingEnabled = true;this.lstSentMessages.HorizontalScrollbar = true;this.lstSentMessages.Location = new System.Drawing.Point(12, 270);this.lstSentMessages.Name = "lstSentMessages";this.lstSentMessages.Size = new System.Drawing.Size(381, 160);this.lstSentMessages.TabIndex = 3;// lblStatusthis.lblStatus.AutoSize = true;this.lblStatus.Location = new System.Drawing.Point(12, 450);this.lblStatus.Name = "lblStatus";this.lblStatus.Size = new System.Drawing.Size(55, 13);this.lblStatus.TabIndex = 4;this.lblStatus.Text = "状态: 离线";// label1this.label1.AutoSize = true;this.label1.Location = new System.Drawing.Point(12, 10);this.label1.Name = "label1";this.label1.Size = new System.Drawing.Size(58, 13);this.label1.TabIndex = 5;this.label1.Text = "发送消息:";// label2this.label2.AutoSize = true;this.label2.Location = new System.Drawing.Point(12, 60);this.label2.Name = "label2";this.label2.Size = new System.Drawing.Size(82, 13);this.label2.TabIndex = 6;this.label2.Text = "收到的消息:";// label3this.label3.AutoSize = true;this.label3.Location = new System.Drawing.Point(12, 250);this.label3.Name = "label3";this.label3.Size = new System.Drawing.Size(82, 13);this.label3.TabIndex = 7;this.label3.Text = "发送的消息:";// ServerFormthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(405, 480);this.Controls.Add(this.label3);this.Controls.Add(this.label2);this.Controls.Add(this.label1);this.Controls.Add(this.lblStatus);this.Controls.Add(this.lstSentMessages);this.Controls.Add(this.lstReceivedMessages);this.Controls.Add(this.btnSend);this.Controls.Add(this.txtMessage);this.Name = "ServerForm";this.Text = "内存映射文件 - 服务器端";this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ServerForm_FormClosing);this.ResumeLayout(false);this.PerformLayout();}#endregion}
}

ClientForm.cs文件源码

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace MemoryClientDemo
{public partial class ClientForm : Form{private MemoryMappedFile mmf;private MemoryMappedViewAccessor accessor;private const string MapName = "MySharedMemory";private const int Capacity = 1024;private Thread readThread;private bool isRunning = false;public ClientForm(){InitializeComponent();InitializeClient();}private void InitializeClient(){try{// 连接到现有的内存映射文件mmf = MemoryMappedFile.OpenExisting(MapName);accessor = mmf.CreateViewAccessor();isRunning = true;readThread = new Thread(ReadFromSharedMemory);readThread.IsBackground = true;readThread.Start();UpdateStatus("客户端已连接");}catch (FileNotFoundException){MessageBox.Show("服务器未启动,请先启动服务器端程序");UpdateStatus("连接失败 - 服务器未启动");}catch (Exception ex){MessageBox.Show($"客户端启动失败: {ex.Message}");UpdateStatus($"连接失败: {ex.Message}");}}private void ReadFromSharedMemory(){while (isRunning){try{// 读取数据长度int dataLength = accessor.ReadInt32(0);if (dataLength > 0){// 读取实际数据byte[] buffer = new byte[dataLength];accessor.ReadArray(4, buffer, 0, dataLength);string receivedMessage = Encoding.UTF8.GetString(buffer);// 在UI线程上更新接收到的消息Invoke(new Action(() =>{lstReceivedMessages.Items.Add($"[{DateTime.Now:HH:mm:ss}] 收到: {receivedMessage}");lstReceivedMessages.TopIndex = lstReceivedMessages.Items.Count - 1;}));// 清空数据长度标记,表示数据已读取accessor.Write(0, 0);}Thread.Sleep(100);}catch (ThreadAbortException){break;}catch (Exception ex){Invoke(new Action(() =>UpdateStatus($"读取错误: {ex.Message}")));Thread.Sleep(1000);}}}private void btnSend_Click(object sender, EventArgs e){SendMessage(txtMessage.Text);}private void SendMessage(string message){if (string.IsNullOrWhiteSpace(message)){MessageBox.Show("请输入要发送的消息");return;}try{byte[] buffer = Encoding.UTF8.GetBytes(message);int dataLength = buffer.Length;if (dataLength > Capacity - 4){MessageBox.Show("消息太长,无法发送");return;}// 写入数据长度和实际数据accessor.Write(0, dataLength);accessor.WriteArray(4, buffer, 0, dataLength);lstSentMessages.Items.Add($"[{DateTime.Now:HH:mm:ss}] 发送: {message}");lstSentMessages.TopIndex = lstSentMessages.Items.Count - 1;txtMessage.Clear();txtMessage.Focus();}catch (Exception ex){MessageBox.Show($"发送失败: {ex.Message}");}}private void UpdateStatus(string status){lblStatus.Text = status;}private void ClientForm_FormClosing(object sender, FormClosingEventArgs e){isRunning = false;readThread?.Join(1000);accessor?.Dispose();mmf?.Dispose();}private void txtMessage_KeyPress(object sender, KeyPressEventArgs e){if (e.KeyChar == (char)Keys.Enter){btnSend_Click(sender, e);e.Handled = true;}}#region Windows Form Designer generated codeprivate System.ComponentModel.IContainer components = null;private TextBox txtMessage;private Button btnSend;private ListBox lstReceivedMessages;private ListBox lstSentMessages;private Label lblStatus;private Label label1;private Label label2;private Label label3;protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}private void InitializeComponent(){this.txtMessage = new System.Windows.Forms.TextBox();this.btnSend = new System.Windows.Forms.Button();this.lstReceivedMessages = new System.Windows.Forms.ListBox();this.lstSentMessages = new System.Windows.Forms.ListBox();this.lblStatus = new System.Windows.Forms.Label();this.label1 = new System.Windows.Forms.Label();this.label2 = new System.Windows.Forms.Label();this.label3 = new System.Windows.Forms.Label();this.SuspendLayout();// txtMessagethis.txtMessage.Location = new System.Drawing.Point(12, 30);this.txtMessage.Name = "txtMessage";this.txtMessage.Size = new System.Drawing.Size(300, 20);this.txtMessage.TabIndex = 0;this.txtMessage.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtMessage_KeyPress);// btnSendthis.btnSend.Location = new System.Drawing.Point(318, 28);this.btnSend.Name = "btnSend";this.btnSend.Size = new System.Drawing.Size(75, 23);this.btnSend.TabIndex = 1;this.btnSend.Text = "发送";this.btnSend.UseVisualStyleBackColor = true;this.btnSend.Click += new System.EventHandler(this.btnSend_Click);// lstReceivedMessagesthis.lstReceivedMessages.FormattingEnabled = true;this.lstReceivedMessages.HorizontalScrollbar = true;this.lstReceivedMessages.Location = new System.Drawing.Point(12, 80);this.lstReceivedMessages.Name = "lstReceivedMessages";this.lstReceivedMessages.Size = new System.Drawing.Size(381, 160);this.lstReceivedMessages.TabIndex = 2;// lstSentMessagesthis.lstSentMessages.FormattingEnabled = true;this.lstSentMessages.HorizontalScrollbar = true;this.lstSentMessages.Location = new System.Drawing.Point(12, 270);this.lstSentMessages.Name = "lstSentMessages";this.lstSentMessages.Size = new System.Drawing.Size(381, 160);this.lstSentMessages.TabIndex = 3;// lblStatusthis.lblStatus.AutoSize = true;this.lblStatus.Location = new System.Drawing.Point(12, 450);this.lblStatus.Name = "lblStatus";this.lblStatus.Size = new System.Drawing.Size(55, 13);this.lblStatus.TabIndex = 4;this.lblStatus.Text = "状态: 离线";// label1this.label1.AutoSize = true;this.label1.Location = new System.Drawing.Point(12, 10);this.label1.Name = "label1";this.label1.Size = new System.Drawing.Size(58, 13);this.label1.TabIndex = 5;this.label1.Text = "发送消息:";// label2this.label2.AutoSize = true;this.label2.Location = new System.Drawing.Point(12, 60);this.label2.Name = "label2";this.label2.Size = new System.Drawing.Size(82, 13);this.label2.TabIndex = 6;this.label2.Text = "收到的消息:";// label3this.label3.AutoSize = true;this.label3.Location = new System.Drawing.Point(12, 250);this.label3.Name = "label3";this.label3.Size = new System.Drawing.Size(82, 13);this.label3.TabIndex = 7;this.label3.Text = "发送的消息:";// ClientFormthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(405, 480);this.Controls.Add(this.label3);this.Controls.Add(this.label2);this.Controls.Add(this.label1);this.Controls.Add(this.lblStatus);this.Controls.Add(this.lstSentMessages);this.Controls.Add(this.lstReceivedMessages);this.Controls.Add(this.btnSend);this.Controls.Add(this.txtMessage);this.Name = "ClientForm";this.Text = "内存映射文件 - 客户端";this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ClientForm_FormClosing);this.ResumeLayout(false);this.PerformLayout();}#endregion}
}

三、效果演示

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

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

相关文章

rqlite 集成sqlite-vec 简单说明

rqlite 集成sqlite-vec 简单说明rqlite 是一个基于raft 的实现的分布式sqlite,sqlite-vec 是可以直接集成rqlite的,核心是sqlite 的插件机制,以下是一个简单试用 环境准备 可以使用docker 或者直接下载二进制包运行…

英语_阅读_Water Sliding_待读

One, two, three... Goooooooh! 一、二、三……出发咯! Slide down the slope. 沿着斜坡滑下去。 Hit the pool with a splash. “扑通”一声掉进泳池。 Water-slides might seem simple. 水滑梯看起来可能很简单。 B…

实用指南:ArcGIS JSAPI 高级教程 - 高亮效果优化之开启使用多高亮样式

实用指南:ArcGIS JSAPI 高级教程 - 高亮效果优化之开启使用多高亮样式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

网站入口自己找网站开发项目

远程手机遥控开关的工作原理主要是通过互联网传递无线信号,控制用电器的一种智能家居产品。 远程手机遥控开关的基本套件包括:手机APP、网线、家用WIFI中转无服务器或者是工厂提供的自带网线端口的中转服务器、连接用电器的接收器。使用时,手…

网站后台代码添加图片wordpress怎么弄

如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效…

手机网站菜单栏怎么做东莞网站建设推广技巧

博主是搞是个FPGA的,一直没有真正的研究过以太网相关的技术,现在终于能静下心学习一下,希望自己能更深入的掌握这项最基本的通信接口技术。下面就开始搞了。 一、OSI参考模型 今天我们先学习一下以太网最基本也是重要的知识——OSI参考模型。…

电商网站界面规范新型建筑模板

SA8000认证流程 SA8000认证流程的第一步是申请组织参加管理体系在线自我评估。Social Fingerprint自我评估可以帮助该组织了解 SA8000管理体系要求并判断是否已做好认证申请准备。当该组织认为其管理实践足够成熟,具备认证条件时,可以从20 多家独立的SAA…

用wang域名做购物网站怎么样网站建设预算策划

http://blog.csdn.net/lu_embedded/article/details/60469851 由于 Linux 所具备的开源、稳定、高效、易裁剪、硬件支持广泛等优点,使得它在嵌入式系统领域最近十几年内迅速崛起。目前嵌入式 Linux 系统开发已经开辟了很大的市场,同时也开发出很多成型的…

const在for用不了

js中关于const在for in或者for of中的使用_for in const-CSDN博客

新闻静态网站模板自建视频网站

🌟博主主页:我是一只海绵派大星 📚专栏分类:软件测试笔记 📚参考教程:黑马教程❤️感谢大家点赞👍收藏⭐评论✍️ 目录 1、操作系统 2、Linux发展历程 3、命令行程序 4、cd 切换文件夹…

苏州做网站优化社交电商系统开发

引言 原文链接 近日,一场由微软视窗系统软件更新引发的全球性"微软蓝屏"事件震惊了整个科技界。这次事件源于美国电脑安全技术公司"众击"提供的一个带有"缺陷"的软件更新,如同一颗隐形炸弹在全球范围内引爆,…

网站开发毕业设计摘要范文剪辑师培训班有用吗

IIS-HTTPS(TSL)强制开启的方法和解决过时的安全问题 系统为:Windows server 2008R2 工具为:IIS6 数据库为: Windows Sql server 2014 证书为:腾讯云颁发的AC证书 首先你需要这几个工具 IISCrypto | 检测和为你配置最安全的 策略环境 手写reg注册表 | 来关闭本地的事件 Windo…

有做外贸的平台网站吗永城网站建设

鸿蒙是面向5G物联网、面向全场景的分布式操作系统,其不是安卓系统的分支或修改而来的,与安卓、iOS是不一样的操作系统。鸿蒙将打通手机、电脑、平板、电视、电器设备、工业自动化控制、无人驾驶、车机设备 、智能穿戴统一成一个操作系统,并且…

需要锦州网站建设自己电脑wordpress

数据对齐 数据对齐是一种计算机内存管理技术,确保数据存储在内存中的特定地址上,以提高访问效率和性能。 不同的数据类型(如整数、浮点数、指针等)在内存中的存储位置通常需要满足特定的边界要求,即数据的起始地址是其…

10月北京中学集训随笔

10.4~10.8计划 长达5天的模拟赛 根据刚哥的压力提前释放理论 所以这五天的模拟赛一定要给予最高级别的重视

公司网站域名com好还是cn好视频拍摄剪辑培训班

【说明:转载于http://blog.csdn.net/jojo52013145/article/details/5783677】 1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发"&…

icp备案网站用不了淄博网站建设 招聘

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

专业做俄语网站建设网站建设公司哪好

在此实现了一个基本的IL汇编程序; 了解MSIL汇编和IL汇编评估堆栈_bcbobo21cn的博客-CSDN博客 它用了下面两句来在屏幕输出字符串, ldstr "I am from the IL Assembly Language..." call void [mscorlib]System.Console::WriteLine (string) …

为什么做的网站在浏览器搜不到做暧暧视频免费视频中国网站

在攻击中,命令注入是比较常见的方式,今天我们细说在软件开发中如何避免命令执行漏洞 我们通过DVWA中不同的安全等级来细说命令执行漏洞 1、先调整DVWA的安全等级为Lower,调整等级在DVWA Security页面调整 2、在Command Injection页面输入127.0.0.1&…

使用100%缩放比例重新启动Visual Studio 界面模糊的解决方案

问题描述 建议:如果是刚开始写WinForm项目 ,建议刚开始就去进行一个替换 ,要不然后面会很麻烦的 ,不仅要计算size 还要去 计算 location 的值 昨天碰到了这个问题 ,当时设置完之后界面就非常的模糊 ,虽然说界面变…