-
其他应用层协议(FTP、SMTP、DNS)
0第8章 其他应用层协议实战
8.1 其他应用层协议(FTP、SMTP、DNS)
一、为什么要学这些“老”协议?
我刚做开发时,觉得FTP、SMTP都是过时的协议,直到做文件备份系统,才发现FTP是最成熟的文件传输协议;做邮件通知系统,SMTP是发送邮件的标准;做域名解析工具,DNS是互联网的“电话簿”。这些协议虽然诞生早,但至今仍是互联网的基础——就像水电煤,平时感觉不到,但离了不行。这节我把自己实vb.net教程C#教程python教程SQL教程access 2010教程
战过的场景、踩过的坑都揉进去,用大白话讲透FTP、SMTP、DNS的核心用法,结合C#代码逐行讲解,让你快速上手这些协议。
二、FTP:文件传输的“老大哥”
FTP(文件传输协议)是专门用来传输文件的协议,支持上传、下载、创建目录、删除文件等操作——就像你用U盘在电脑之间传文件,只不过FTP是通过网络传。
-
FTP的核心概念
控制连接:客户端和服务器之间的命令通道,用于发送上传、下载等命令(默认端口21);
数据连接:客户端和服务器之间的文件传输通道,用于传输文件数据(默认端口20);
主动模式(PORT):服务器主动发起数据连接到客户端;
被动模式(PASV):客户端主动发起数据连接到服务器(现在大部分客户端默认用被动模式,因为客户端可能在防火墙后面)。 -
C#实战:用FluentFTP操作FTP服务器
FluentFTP是.NET生态中最流行的FTP库,支持FTP、FTPS、SFTP,用法简单——就像你用Windows资源管理器操作FTP服务器。
步骤1:安装FluentFTP
bash
dotnet add package FluentFTP
(1)连接FTP服务器,列出文件和目录
csharp
using System;
using FluentFTP;
namespace FtpListDemo;
class Program
{
static void Main(string[] args)
{
// FTP服务器信息
string host = "ftp.example.com";
int port = 21;
string username = "your-username";
string password = "your-password";
// 1. 创建FTP客户端实例
using var ftpClient = new FtpClient(host, port, username, password);
try
{
// 2. 连接FTP服务器
ftpClient.Connect();
Console.WriteLine("已连接到FTP服务器");
// 3. 列出根目录下的文件和目录
FtpListItem[] items = ftpClient.GetListing("/");
foreach (var item in items)
{
string type = item.Type switch
{
FtpObjectType.Directory => "[目录]",
FtpObjectType.File => "[文件]",
_ => "[未知]"
};
Console.WriteLine($"{type} {item.Name}");
}
}
catch (Exception ex)
{
Console.WriteLine($"FTP操作失败:{ex.Message}");
}
finally
{
// 4. 断开连接
if (ftpClient.IsConnected)
{
ftpClient.Disconnect();
Console.WriteLine("已断开FTP服务器连接");
}
}
}
}
代码逐行讲:
1.new FtpClient(host, port, username, password):创建FTP客户端实例,传入服务器地址、端口、用户名、密码;
2.ftpClient.Connect():连接FTP服务器;如果需要用FTPS(加密FTP),用ftpClient.EnableSsl = true;;
3.ftpClient.GetListing("/"):列出根目录下的所有文件和目录,返回FtpListItem数组;
4.item.Type:判断是文件还是目录,FtpObjectType.Directory是目录,FtpObjectType.File是文件;
5.ftpClient.Disconnect():断开连接,必须在finally中执行,避免资源泄漏。
(2)上传文件到FTP服务器
csharp
// 本地文件路径
string localFilePath = @"C: est.txt";
// FTP服务器目标路径
string remoteFilePath = "/uploads/test.txt";
// 上传文件:覆盖已存在的文件
ftpClient.UploadFile(localFilePath, remoteFilePath, FtpLocalExists.Overwrite);
Console.WriteLine("文件上传成功");
代码关键:
UploadFile(localFilePath, remoteFilePath, FtpLocalExists.Overwrite):上传本地文件到FTP服务器,FtpLocalExists.Overwrite表示如果目标文件已存在,覆盖它;
还可以上传流:ftpClient.UploadStream(stream, remoteFilePath);
上传进度:ftpClient.UploadFile(localFilePath, remoteFilePath, FtpLocalExists.Overwrite, FtpVerify.None, (progress) => { Console.WriteLine($"上传进度:{progress.Progress}%"); });。
(3)下载文件从FTP服务器
csharp
// FTP服务器文件路径
string remoteFilePath = "/uploads/test.txt";
// 本地保存路径
string localFilePath = @"C:downloaded-test.txt";
// 下载文件:覆盖已存在的文件
ftpClient.DownloadFile(localFilePath, remoteFilePath, FtpLocalExists.Overwrite);
Console.WriteLine("文件下载成功");
(4)创建目录、删除文件
csharp
// 创建目录
ftpClient.CreateDirectory("/new-folder");
Console.WriteLine("目录创建成功");
// 删除文件
ftpClient.DeleteFile("/uploads/test.txt");
Console.WriteLine("文件删除成功");
// 删除目录(必须为空)
ftpClient.DeleteDirectory("/new-folder");
Console.WriteLine("目录删除成功");
三、SMTP:发送邮件的“标准通道”
SMTP(简单邮件传输协议)是专门用来发送邮件的协议——就像你用快递寄信,SMTP是快递员,负责把邮件从你的电脑送到收件人的邮箱服务器。
-
SMTP的核心概念
SMTP服务器:负责发送邮件的服务器,比如QQ邮箱的SMTP服务器是smtp.qq.com,端口465(SSL加密);
POP3/IMAP:负责接收邮件的协议,POP3是下载邮件到本地,IMAP是在服务器上管理邮件;
MIME:邮件的格式标准,支持文本、图片、附件等。 -
C#实战:用System.Net.Mail发送邮件
.NET自带System.Net.Mail命名空间,不需要额外安装包,就能发送邮件——就像你用Outlook写邮件,不需要懂SMTP协议的细节。
(1)发送简单文本邮件
csharp
using System;
using System.Net;
using System.Net.Mail;
namespace SmtpSendEmail;
class Program
{
static void Main(string[] args)
{
// SMTP服务器信息
string smtpHost = "smtp.qq.com";
int smtpPort = 465;
string smtpUsername = "your-qq-email@qq.com";
string smtpPassword = "your-qq-authorization-code"; // QQ邮箱需要用授权码,不是密码
// 邮件信息
string fromEmail = "your-qq-email@qq.com";
string toEmail = "recipient@example.com";
string subject = "测试邮件";
string body = "这是一封用C#发送的测试邮件";
// 1. 创建邮件实例
var mailMessage = new MailMessage(fromEmail, toEmail, subject, body);
// 2. 创建SMTP客户端实例
var smtpClient = new SmtpClient(smtpHost, smtpPort)
{
Credentials = new NetworkCredential(smtpUsername, smtpPassword),
EnableSsl = true // 启用SSL加密,必须设置,否则发送失败
};
try
{
// 3. 发送邮件
smtpClient.Send(mailMessage);
Console.WriteLine("邮件发送成功");
}
catch (Exception ex)
{
Console.WriteLine($"邮件发送失败:{ex.Message}");
}
finally
{
// 4. 释放资源
mailMessage.Dispose();
smtpClient.Dispose();
}
}
}
代码逐行讲:
1.new MailMessage(fromEmail, toEmail, subject, body):创建邮件实例,传入发件人、收件人、主题、正文;
2.new SmtpClient(smtpHost, smtpPort):创建SMTP客户端实例,传入服务器地址和端口;
3.Credentials = new NetworkCredential(smtpUsername, smtpPassword):设置SMTP服务器的用户名和密码——QQ邮箱、163邮箱等需要用授权码,不是登录密码;
4.EnableSsl = true:启用SSL加密,必须设置,否则大部分SMTP服务器会拒绝连接;
5.smtpClient.Send(mailMessage):发送邮件;如果需要异步发送,用smtpClient.SendAsync(mailMessage, null)。
(2)发送带附件的邮件
csharp
// 添加附件
string attachmentPath = @"C: est.txt";
var attachment = new Attachment(attachmentPath);
mailMessage.Attachments.Add(attachment);
(3)发送HTML格式的邮件
csharp
// 设置邮件正文为HTML格式
mailMessage.IsBodyHtml = true;
mailMessage.Body = "<h1>这是HTML邮件</h1><p>这是一段<b>加粗</b>的文本</p>";
四、DNS:互联网的“电话簿”
DNS(域名系统)是专门用来把域名转换成IP地址的协议——就像你用电话簿查号码,输入域名(比如www.baidu.com),DNS返回IP地址(比如110.242.68.66)。
-
DNS的核心概念
递归查询:客户端向本地DNS服务器查询,本地DNS服务器负责递归查询直到找到IP地址;
迭代查询:本地DNS服务器向根DNS服务器查询,根DNS服务器返回顶级域名服务器地址,本地DNS服务器再向顶级域名服务器查询,直到找到IP地址;
DNS缓存:本地DNS服务器会缓存查询结果,避免重复查询,提高速度。 -
C#实战:用Dns类解析域名
.NET自带System.Net.Dns类,不需要额外安装包,就能解析域名——就像你用nslookup命令查域名。
(1)解析域名到IP地址
csharp
using System;
using System.Net;
using System.Threading.Tasks;
namespace DnsLookupDemo;
class Program
{
static async Task Main(string[] args)
{
string domain = "www.baidu.com";
try
{
// 1. 异步解析域名,返回IP地址数组
IPAddress[] ipAddresses = await Dns.GetHostAddressesAsync(domain);
Console.WriteLine($"域名 {domain} 的IP地址:");
foreach (var ipAddress in ipAddresses)
{
Console.WriteLine($"- {ipAddress}");
}
}
catch (Exception ex)
{
Console.WriteLine($"DNS解析失败:{ex.Message}");
}
}
}
代码关键:
Dns.GetHostAddressesAsync(domain):异步解析域名,返回IPAddress数组——一个域名可能对应多个IP地址(比如负载均衡);
还可以反向解析:Dns.GetHostEntryAsync(ipAddress),把IP地址转换成域名。
(2)获取域名的DNS记录
如果需要获取更详细的DNS记录(比如A记录、MX记录、CNAME记录),可以用DnsClient库:
bash
dotnet add package DnsClient
csharp
using System;
using DnsClient;
namespace DnsRecordDemo;
class Program
{
static void Main(string[] args)
{
string domain = "example.com";
// 创建DNS客户端实例
var dnsClient = new LookupClient();
// 获取MX记录(邮件服务器记录)
var mxRecords = dnsClient.Query(domain, QueryType.MX);
Console.WriteLine($"域名 {domain} 的MX记录:");
foreach (var record in mxRecords.Answers.MxRecords())
{
Console.WriteLine($"- {record.Exchange} 优先级:{record.Preference}");
}
// 获取CNAME记录(别名记录)
var cnameRecords = dnsClient.Query("www.example.com", QueryType.CNAME);
Console.WriteLine($"域名 www.example.com 的CNAME记录:");
foreach (var record in cnameRecords.Answers.CnameRecords())
{
Console.WriteLine($"- {record.CanonicalName}");
}
}
}
五、基础知识拓展
-
FTP vs SFTP vs FTPS
FTP:明文传输,不安全,容易被窃听;
FTPS:FTP + SSL/TLS,加密传输,安全;
SFTP:基于SSH的文件传输协议,加密传输,安全——和FTP是完全不同的协议,只是功能类似。
C#实战:用FluentFTP操作SFTP
csharp
var sftpClient = new SftpClient(host, port, username, password);
sftpClient.Connect();
sftpClient.UploadFile(localFilePath, remoteFilePath);
sftpClient.Disconnect();
-
怎么获取QQ邮箱的授权码?
1.登录QQ邮箱,点击“设置”→“账户”;
2.找到“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”;
3.开启“SMTP服务”,点击“生成授权码”;
4.按照提示验证手机,生成授权码——这个授权码就是SMTP的密码。 -
DNS污染和DNS劫持怎么解决?
DNS污染:DNS服务器返回错误的IP地址,比如访问www.google.com返回国内的IP地址;
DNS劫持:DNS服务器返回恶意的IP地址,比如访问www.baidu.com返回钓鱼网站的IP地址;
解决方法:用公共DNS服务器,比如114.114.114.114(国内)、8.8.8.8(谷歌)、223.5.5.5(阿里)。
C#实战:指定DNS服务器解析域名
csharp
var dnsClient = new LookupClient(IPAddress.Parse("8.8.8.8"));
var ipAddresses = dnsClient.Query("www.google.com", QueryType.A).Answers.ARecords().Select(r => r.Address);
六、总结:这些“老”协议仍是互联网的基础
FTP:成熟的文件传输协议,适合批量上传、下载文件;
SMTP:发送邮件的标准协议,适合邮件通知、验证码等场景;
DNS:互联网的“电话簿”,所有网络应用都离不开它;
进阶:需要加密传输,用FTPS、SFTP;需要发送复杂邮件,用MailKit库;需要获取详细DNS记录,用DnsClient库。
本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49521.html










