首页 > 其他分享 >SMB协议实现局域网之间文件传输

SMB协议实现局域网之间文件传输

时间:2023-07-30 14:57:29浏览次数:40  
标签:files string ip 文件传输 局域网 SmbFile new SMB

一、背景

为解决历史资料存储位置分散(局域网不同服务器),管理人员众多,资料管理仍保留在传统ftp管理阶段等问题,开展对历史资料管理功能,具体需求功能因为保密协议就不在阐述,本次只针对技术局域网之间传输技术进行讨论;

二、技术对比

访问局域网中共享信息有两种方式,网络映射、SMB协议访问,这两种都是比较成熟的技术了。

 

序号

指标

网络映射

SMB协议

1

传输

速度

传输效率主要跟局域网网络传输效率有关,传输效率快。

在文件传输过程中,创建文件会导致高协议开销和较高的文件系统开销。 对于大型文件传输,这些成本仅出现一次。 当传输大量小文件时,成本是重复的,导致传输速度缓慢;

2

第一次访问

必须在本地创建映射

通过用户名、密码直接可以访问

3

访问人数

无限制

无限制

4

系统兼容性

兼容windows、Linux系统

SMB协议只能在windows系统之间传输,如果是Linux主机,需要对linux主机安装Samba

5

传输是否加密

加密

加密

6

安全性

如果在一台服务器映射多个磁盘会有安全隐患;不能创建同一个ip下的不通共享目录

局域网内所有电脑都可以通过smb协议进行访问,有安全隐患。

 

 

三、SMB协议介绍

 

 

SMB(Server Message Block)是由微软开发的一种软件程序级的网络传输协议,主要用来使得一个网络上的计算机共享计文件、打印机、串行端口和通信等资源。它也提供认证的进行进程间通讯机能。通过Unix服务器厂商从新开发后,它能够用于链接Unix服务器和Windows客户机,执行打印和文件共享等任务。

  SMB一开始的设计是在NetBIOS协议上运行的(而NetBIOS自己则运行在NetBEUI、IPX/SPX或TCP/IP协议上)。从Windows2000开始,微软引入SMB Direct Over TCP,从新命名为 CIFS(Common Internet File System),并打算将它与NetBIOS相脱离,试图使它成为Internet上计算机之间相互共享数据的一种标准。CIFS是公开或开放的SMB协议版本。s

 

四、SMB协议实现常用功能

参考的:https://www.cjavapy.com/article/395/

基础环境:.net 4.5以上   

smb包:SharpCifs.Core,

(1)windows创建共享目录

创建共享目录这块不是重点,可参考如下网站:

https://jingyan.baidu.com/article/0bc808fc1f06765ad485b987.html

(2)SMB协议连接共享目录

        /// <summary>

        /// 测试连接是否通

        /// </summary>

        /// <param name="returnMessag"></param>

        /// <param name="ip"></param>

        /// <param name="name"></param>

        /// <param name="pwd"></param>

        /// <param name="folder"></param>

        /// <returns></returns>

        public bool GetCon(string ip, string name, string pwd, string folder)

        {

            SharpCifs.Config.SetProperty("jcifs.smb.client.lport", "8137");

            var auth2 = new NtlmPasswordAuthentication(ip, name, pwd);

            SmbFile outDirFile = new SmbFile("smb://" + ip + "/" + folder + "/", auth2);

            bool returnMessag = outDirFile.Exists();

            return returnMessag;

        }

(3)通过SMB协议获取文件信息

     #region 获取文档信息,这块使用了递归

 

 

        /// <summary>

        /// 获取文档信息

        /// </summary>

        /// <param name="liststring"></param>

        /// <param name="ip_folder"></param>

        /// <param name="name"></param>

        /// <param name="pwd"></param>

        /// <param name="ip"></param>

        public void getListString(List<FileClass> liststring, string ip_folder, string name, string pwd, string ip, string parentdocid)

        {

            SmbFile outDirFile = new SMBClass().GetSmbFile(ip_folder, name, pwd, ip);

            var epocDate = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

            string msg = "";

            foreach (SmbFile item in outDirFile.ListFiles())

            {

                try

                {

                    FileClass files = new FileClass();

                    files.IsFileDoc = false;

                    var type = item.IsFile() ? "file" : "dir";

                    var filename = "";// item.GetName();//文件名称

                    if (type == "dir")

                    {

                        filename = FilesClass.getFiles(item.ToString(), type);

                        files.IsFileDoc = true;

                        files.FileSize = 0;

                    }

                    else

                    {

                        filename = FilesClass.getFiles(item.ToString(), type);

                        files.FileSize = item.Length();

                        files.DocFileType = FilesClass.getFileExt(filename);

                    }

                    DateTime tm = item.GetLocalCreateTime();

                    files.CreationDate = tm;

                    files.DocName = filename;

                    files.DocID = Guid.NewGuid().ToString().Trim();

                    files.DocType = 2;

                    files.ParentDocid = parentdocid;

                    files.DocFileNameWithPath = item.ToString().Replace("%23", "#");

                    files.FileFullPath = item.ToString().Replace("smb://" + ip + "/", "").Replace("%23", "#");///文档全路径,解决特殊字符问题;

                    liststring.Add(files);

 

                    if (type == "dir")

                    {

                        getListString(liststring, item.ToString(), name, pwd, ip, files.DocID);///递归循环

                    }

                }

                catch (Exception ex)

                {

                   /// new NoteClass().WriteNoteToTxt("错误:" + ex.Message);                

}

 

            }

 

        }

        #endregion

 

(4)通过SMB协议判断文件是否存在、删除文件信息

调用方法:

  SmbFile file = new SMBClass().GetSmbFile(filepyth, username, pwd, ip);//获取SMBfiles

  bool returnMessag = file.Exists();

  if (returnMessag) {file.Delete();}

        /// <summary>

        /// 获取文件信息

        /// </summary>

        /// <param name="returnMessag"></param>

        /// <param name="ip_folder"></param>

        /// <param name="name"></param>

        /// <param name="pwd"></param>

        /// <param name="folder"></param>

        /// <returns></returns>

        public SmbFile GetSmbFile(string ip_folder, string name, string pwd, string ip)

        {

            SharpCifs.Config.SetProperty("jcifs.smb.client.lport", "8137");

            NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(ip, name, pwd);

            ip_folder = ip_folder.Replace("#", "%23");//特殊字符处理

            Uri url = new Uri(ip_folder);

            SmbFile outDirFile = new SmbFile(url, auth);

            return outDirFile;

}

 

(5)通过SMB协议下载

 

   

   public SmbFileInputStream getsmb(string filepath, string ip, string name, string pwd)

        {

            try

            {

                var ip_folder = filepath;// "smb://192.168.1.18/wp/2.txt";///文件信息

                SmbFile file = new SMBClass().GetSmbFile(ip_folder, name, pwd, ip);//获取SMBfiles

                int length = file.GetContentLength();//得到文件的大小

                byte[] buffer = new byte[length];

                SmbFileInputStream stream = new SmbFileInputStream(file); //建立smb文件输入流

                return stream;

            }

            catch (Exception ex)

 {

                return null;

            }

        }

 

(6)通过SMB协议上传

            string url_local = @"D:\Users\Desktop\码\demo\SharpCifs.Core.dll";//本地文件

            String URL_remote = "smb://192.169.1.1/test/SharpCifs.Core.dll";//服务器文件

            ///1、创建映射

            String domainip = "192.169.1.1";///访问用户信息

            String userName = "test";//远程用户

            String passWord = "test";//密码

            String fileName = "test";///文件信息

 

            SharpCifs.Config.SetProperty("jcifs.smb.client.lport", "8137");

            var auth2 = new NtlmPasswordAuthentication(domainip, userName, passWord);

            SmbFile smbfile = new SmbFile(URL_remote, auth2);

 

 

            //2、获取本地文件路径

 

            FilePath pathes = new FilePath(url_local);

            InputStream ins = new FileInputStream(pathes);

 

 

            //3、开始上传

 

            if (smbfile.Exists())

            {

                MessageBox.Show("已存在。");

            }

            else

            {

                smbfile.Connect();

                OutputStream outs = new SmbFileOutputStream(smbfile);

                byte[] buffer = new byte[4096];

                int len = 0; //读取长度

                while ((len = ins.Read(buffer, 0, buffer.Length)) != -1)

                {

                    outs.Write(buffer, 0, len);

                }

                outs.Flush(); //刷新缓冲的输出流

                MessageBox.Show("上传完成。");

 

            }

标签:files,string,ip,文件传输,局域网,SmbFile,new,SMB
From: https://www.cnblogs.com/baiantao/p/17591422.html

相关文章

  • 魔兽单机版局域网设置教程
    这是一个老版本的教程,最新的魔兽世界服务端可以完成一键安装首先找到魔兽的安装目录魔兽世界\WowEmu\ArcEmu\configs。(WowEmu这文件夹)是魔兽单机版的,也就是在WowEmu中国论坛上下的3.05版的客服,然后照它说的安,在魔兽里就有的(废话!)。正题,configs文件里是不是有4个文件啊,分别是arcemu-l......
  • 2023.07 WSL2 CentOS 使用桥接网卡固定IP/加入局域网
    WSL2CentOS使用桥接网卡固定IP/加入局域网参考资料https://zhuanlan.zhihu.com/p/593263088https://www.cnblogs.com/lic0914/p/17003251.html进入Hyper-V管理器新建桥接网卡进入%USERPROFILE%目录新建.wslconfig文件[wsl2]vmIdleTimeout=-1networkingMo......
  • 高效文件传输:小文件采用零拷贝、大文件采用异步io+直接io
    一般会如何实现文件传输?服务器提供文件传输功能,需要将磁盘上的文件读取出来,通过网络协议发送到客户端。如果需要你自己编码实现这个文件传输功能,你会怎么实现呢?通常,你会选择最直接的方法:从网络请求中找出文件在磁盘中的路径后,如果这个文件比较大,假设有320MB,可以在内存中分配32KB......
  • 支持13系统! MacDroid pro Mac连接安卓设备 安卓文件传输工具
    太棒了。。。MacDroid终于支持13系统了!!MacDroid是一款可以让你在Mac电脑上访问和管理Android设备的软件。它可以通过USB连接,让你在Mac上浏览Android设备上的文件,包括照片、音乐、视频、文档等等。同时,它也支持将文件从Mac传输到Android设备上。此外,它还可以让你在Mac上备份和......
  • Windows子系统(WSL)通过桥接网络实现被外部局域网主机直接
    实现方法思路就是将wsl2自建的虚拟NAT网络桥接到windows主机网卡上,主要参考这篇文章 1、开启hyper-v桥接功能需要windows的hyper-v组件支持,但是win10/11家庭版是不包含hyper-v的,专业版才包含。网上也有文章提到家庭版安装hyper-v的方法,但是我没有测试,以下内容都是在win11专业......
  • .net core webapi 局域网内机器可以互相访问
    1、  使用localhost的方式运行程序  dotnetFitnessequipment.dll--urls=http://localhost:5038    是无法通过ip访问的,只可以使用localhost访问    2、以ip方式运行程序,dotnetFitnessequipment.dll--urls=http://192.168.3.213:5038     ......
  • smbclient
    smbclient交互方式访问samba服务器补充说明smbclient命令属于samba套件,它提供一种命令行使用交互式方式访问samba服务器的共享资源。语法smbclient(选项)(参数)选项-B<ip地址>:传送广播数据包时所用的IP地址;-d<排错层级>:指定记录文件所记载事件的详细程度;-E:将信息送到标......
  • smbpasswd
    smbpasswdsamba用户和密码管理工具补充说明smbpasswd命令属于samba套件,能够实现添加或删除samba用户和为用户修改密码。语法smbpasswd(选项)(参数)选项-a:向smbpasswd文件中添加用户;-c:指定samba的配置文件;-x:从smbpasswd文件中删除用户;-d:在smbpasswd文件中禁用指定的用......
  • Java-Day-32( 多用户即时通信系统 —— 文件传输 + 服务器推送新闻 + 离线留言 )
    Java-Day-32多用户即时通信系统文件传输思路:客户端里先把文件读取到客户端为字节数组,把文件对应的字节数组封装到message对象,内含文件内容、sender、getter,将message对象发送给服务端拆解message对象获取getterid,获取客户端被指定的接收用户的通信线程,把message转......
  • SMBus协议-3
    参考资料:Linux内核文档:Documentation\i2c\smbus-protocol.rstSMBus协议:http://www.smbus.org/specs/SMBus_3_0_20141220.pdfI2CTools:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/1.SMBus是I2C协议的一个子集SMBus:SystemManagement......