VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#编程 >
  • 其他应用层协议(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是通过网络传。

  1. FTP的核心概念
    控制连接:客户端和服务器之间的命令通道,用于发送上传、下载等命令(默认端口21);
    数据连接:客户端和服务器之间的文件传输通道,用于传输文件数据(默认端口20);
    主动模式(PORT):服务器主动发起数据连接到客户端;
    被动模式(PASV):客户端主动发起数据连接到服务器(现在大部分客户端默认用被动模式,因为客户端可能在防火墙后面)。
  2. 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是快递员,负责把邮件从你的电脑送到收件人的邮箱服务器。

  1. SMTP的核心概念
    SMTP服务器:负责发送邮件的服务器,比如QQ邮箱的SMTP服务器是smtp.qq.com,端口465(SSL加密);
    POP3/IMAP:负责接收邮件的协议,POP3是下载邮件到本地,IMAP是在服务器上管理邮件;
    MIME:邮件的格式标准,支持文本、图片、附件等。
  2. 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)。

  1. DNS的核心概念
    递归查询:客户端向本地DNS服务器查询,本地DNS服务器负责递归查询直到找到IP地址;
    迭代查询:本地DNS服务器向根DNS服务器查询,根DNS服务器返回顶级域名服务器地址,本地DNS服务器再向顶级域名服务器查询,直到找到IP地址;
    DNS缓存:本地DNS服务器会缓存查询结果,避免重复查询,提高速度。
  2. 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}");
	}
	}
	}

五、基础知识拓展

  1. 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();
  1. 怎么获取QQ邮箱的授权码?
    1.登录QQ邮箱,点击“设置”→“账户”;
    2.找到“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”;
    3.开启“SMTP服务”,点击“生成授权码”;
    4.按照提示验证手机,生成授权码——这个授权码就是SMTP的密码。
  2. 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


相关教程