用 Delphi 做 FTP 服务器以及如何配置防火墙

使用 Delphi 的 TIdFTPServer 这个控件,做一个 FTP 服务器很简单。可以直接拿官方提供的 FTP Server 的那个 Demo 程序来修改。

本文主要描述如何配置服务器端防火墙

网络环境:

1. 客户端在路由器后面,局域网;

2. 服务器端在路由器后面的局域网上面。

FTP 配置原理

1. 主动模式:FTP 客户端连接上 FTP 服务器以后,客户端会打开一个 TCP 端口作为接收数据的TCP 服务器,然后 FTP 服务器主动发起 TCP 连接客户端。

1.1. 主动模式的问题:需要客户端所在网络,配置路由器开端口映射到客户端电脑。从实施来说,不方便。

2. 被动模式:FTP 客户端连接上 FTP 服务器后,FTP 服务器另外随机打开一个被动模式的 TCP 端口,将端口告诉客户端;然后,客户端用 TCP 连接这个端口,建立数据传输通道。

2.1. 被动模式:FTP 服务器端要设置防火墙,要设置路由器端口映射。

Indy TIdFTPServer 的用法

在上述描述中,如果使用 TIdFTPServer 这个控件来实现一个 FTP 服务器端程序,需要注意:

1. 路由器开端口映射到服务器端所在电脑 IP 地址的 21 端口;

1.1. 不幸的是,电信对于小端口,封掉。因此,需要映射路由器的 2121 端口,指向内网 FTP 服务器所在 IP 地址的 21 端口。

1.2. FTP 服务器所在电脑的防火墙,设置允许 21 端口的 TCP 连接。

2. IdFTPServer 的属性:PASVBoundPortMax 选择 5003,  PASVBoundPortMin 选择 5000;

2.1. 上述设置的意思是被动模式下,TIdFTPServer 随机打开 5000 到 5003 之间的端口。

3. 路由器上,把 TCP 端口 5000, 5001, 5002, 5003 映射到 FTP 服务器电脑所在的 IP 地址。

4. 客户端,我选用 FileZilla 这个开源的 FTP 服务器;设置如下:

4.1. 服务器地址输入服务器端的公网 IP 或者动态域名地址;

4.2. 端口输入 2121,如果不输入,则是默认的 21,电信不开放;

4.3. 传输设置 -- 传输模式:选择【被动】模式。

5. 防火墙设置:上述所有端口,在 FTP 服务器所在的电脑的防火墙上,设置为允许连接。

以上设置,测试通过。

调试说明:

TIdFTPServer 的 PASV 的那两个端口属性,我一开始设置的是 5000,6000,结果导致它打开的被动模式端口是在这个区间随机,总是不会刚好是路由器上映射的 5000,5001;我又不可能在路由器上设置 1000 个端口映射。所以干脆改为 5000,5003;也就是让 TIdFTPServer 在被动模式下只打开有限的几个端口,然后在路由器端口映射上,映射这几个端口。

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

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

相关文章

StartAI创成式填充(扩图)功能使用教程 约等于Photoshop Beta 25.0

创成式填充,是基于原有图片进行扩展或延展,在保证图片合理性的同时实现与原图片的高度契合。StartAI PS智能AI插件通过【扩图】,【局部重绘】,【背景移除】等功能来实现PS的“创成式填充” StartAI当前最新版本:V0.7.…

java核心面试题解析(持续更新)

1.索引 1.1创建索引: create index 索引名称 on 某张表 (列名) 示例: create index index_name on table (Column names) 1.2索引优化 MySQL数据库索引优化是提高查询性能的重要手段。以下是一些关键的索引优化策略: 选择正确的索引列: 经常需要排序、分组和联…

K8s的Pod出现Init:ImagePullBackOff问题的解决,(以calico网络插件为例)

问题描述: 对于这类问题的解决思路应该都差不多,本文以calico插件安装为例,发现有个Pod的镜像没有pull成功 第一步:查看这个pod的描述信息 kubectl describe pod calico-node-t9rql -n kube-system从上图发现是docker拉取"…

第十三届蓝桥杯省赛真题 Java B 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 星期计算试题 B: 山试题 C: 字符统计试题 D: 最少刷题数试题 E \mathrm{E} E : 求阶乘试题 F : \mathrm{F}: F: 最大子矩阵试题 G: 数组切分试题 H: 回忆迷宫试题 I: 红绿灯试题 J 拉箱子 发现宝藏 前些天发现了一个巨牛的人工智能学习…

精密空调制冷量计算公式

制冷系统设计 环境设计参数 空调系统以《采暖通风与空气调节设计规范》GB50019-2003、《数据中心设计规范》GB50174-2017、《 数据中心用恒温恒湿空调系统》YD/T2061-2009 及《核心机房节能热管理技术规范》QB-H-001-2009 等国家及行业标准规范作为设计依据,总体把握安全可靠、…

Apache FtpServer在Windows上下载安装与使用

Apache FtpServer在Windows上下载安装与使用 1、Apache Ftp Server下载 进入apache官网 https://mina.apache.org/ftpserver-project/old-downloads.html 下载自己使用的版本。 Apache FtpServer 1.1.1及以下的版本需要JDK1.7的支持 Apache FtpServer 1.1.1以上的版本需要JDK…

【Kafka系列】Kafka事务一般在什么场景下使用呢

面试官:听说你精通Kafka,那我就考考你吧 面试官:不用慌尽管说,错了也没关系😊。。。 以【面试官面试】的形式来分享技术,本期是《Kafka系列》,感兴趣就关注我吧❤️ 面试官:生产者重…

ros time 时间戳改为机器开机时间

一、问题描述 因项目需要,需要"ros::Time::now()" 改成获取机器开机时间,此处针对rospy的机器时间修改。 二、修改方法 修改ros源码的文件 /opt/ros/noetic/lib/python3/dist-packages/rospy/rostime.py 修改如下: 定位到 get_rostime() ,并将 float_…

多ip多进程代理的实现方法

目录 写在前面 一、背景 二、实现方法 1. 使用多线程处理代理请求 2. 使用多进程处理代理请求 3. 实现多IP代理 三、总结 写在前面 实现多IP多进程代理需要使用Python的多线程和多进程模块。本文将介绍如何使用这些模块来实现多IP多进程代理,并提供相关的代…

今天简单聊聊容器化

什么是容器化 容器化(Containerization)是一种软件开发和部署的方法,其核心思想是将应用程序及其所有依赖项打包到一个独立的运行环境中,这个环境被称为容器。容器化技术使得应用程序可以在不同的计算环境中以一致的方式运行&…

千万别让老板知道,这套80%海报,是我用生成式 AI 设计的!

继淡人、浓人近期大幅席卷职场,一类新兴稀有人群正在隐秘的角落悄悄蓄力,等待爆发。 他们的特质是: 眼看一脸平静,其实内心汹涌; 嘴上说着收到,实则无语连篇; 他们的幸运色是五彩斑斓的黑&am…

掌握C语言结构体,开启编程新世界

✨✨欢迎👍👍点赞☕️☕️收藏✍✍评论 个人主页:秋邱博客 所属栏目:C语言 (感谢您的光临,您的光临蓬荜生辉) 前言 前面我们也涉及到了结构体的讲解,但是只是粗略的讲了一下。 接下…

MySQL基础(DDL,DML,DQL)

目录 一DDL 1.1数据库操作 1.1.1查询所有数据库: 1.1.2创建数据库 1.1.3 使用数据库 1.1.4 删除数据库 1.2表操作 1.2.1表操作 1.2.1.1创建表 1.2.1.1.1约束 1.2.1.1.2 数据类型 1.2.1.1.2.1 数值类型 1.2.1.1.2.2 字符串类型 1.2.1.1.2.3日期类型 1.…

【C语言】动态内存管理及其常见错误

文章目录 1、前言:为什么要有动态内存分布2、三种动态内存的创建方式及其释放2.1 malloc2.2 calloc2.3 ralloc2.4 free 3、常⻅的动态内存的错误3.1 对NULL指针的解引用操作3.2 对动态开辟空间的越界访问3.3 对非动态开辟内存使用free释放3.4 使⽤free释放⼀块动态开…

2016年认证杯SPSSPRO杯数学建模B题(第二阶段)多帧图像的复原与融合全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 B题 多帧图像的复原与融合 原题再现: 数码摄像技术被广泛使用于多种场合中。有时由于客观条件的限制,拍摄设备只能在较低的分辨率下成像。为简单起见,我们只考虑单色成像。假设成像的分辨率为 32 64&#x…

如何在Java中调用DLL动态库

在Java编程中,有时我们需要调用本地代码库,特别是Windows平台上的DLL(动态链接库)。这种技术允许Java程序利用操作系统特定或性能敏感的功能。在本文中,我们将详细讨论如何在Java中加载和调用DLL动态库,并通…

react中useContext的用法

先在context文件中使用createContext创建初始值 import React from react;const TestContext React.createContext(true);export { TestContext };然后在父组件中引入&#xff0c;利用Provider传入新值 import { TestContext } from /utils/context;<TestContext.Provide…

【Golang入门教程】Go语言变量的声明

Go语言的变量声明是非常灵活和强大的。在Go语言中&#xff0c;你可以通过几种不同的方式来声明变量。下面是一些基本的示例来帮助你理解Go语言中如何声明变量。 ### 1. 使用var关键字 最基本的方式是使用var关键字&#xff0c;后跟变量名、变量类型。你可以在声明的时候初始化变…

NFT Insider #124:Aavegotchi 开启新一季稀有度挖矿,德克萨斯州奥斯汀市登陆 The Sandbox

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members&#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、…

多线程libtorch推理问题

一、环境 我出问题的测试环境如下: pytorch1.10+cu113 pytorch1.10+cu116 pytorch2.2+cu118 libtorch1.10.1+cu113 libtorch1.10.1+cu111 libtorch1.9.0+cu111 二、问题现象 最近封装libtorch的推理为多线程推理的时候,遇到一个现象如下: (1)只要是将模型初始化放到一个…