NetworkStream 和 StreamWriter 在 Linux 上的行为是否不同?
Does NetworkStream with StreamWriter behave differently on Linux?
以下控制台应用程序在 Windows 上工作正常,但是当我 运行 它在 WSL 中或作为 Linux Docker 容器时,我从服务器收到超时。
using System;
using System.IO;
using System.Net.Sockets;
namespace ClientTest
{
class Program
{
static void Main(string[] args)
{
const string server = "inbound-smtp.us-west-2.amazonaws.com";
const int port = 25;
Console.WriteLine($"Connecting to: {server}");
using (var client = new TcpClient(server, port))
{
using (NetworkStream stream = client.GetStream())
using (StreamReader clearTextReader = new StreamReader(stream))
using (StreamWriter clearTextWriter = new StreamWriter(stream) { AutoFlush = true })
{
// read connection response
var connectResponse = clearTextReader.ReadLine();
Console.WriteLine(connectResponse);
// send command
Console.WriteLine($"HELO domain.com");
clearTextWriter.WriteLine("HELO domain.com");
// read command response
var commandResponse = clearTextReader.ReadLine();
Console.WriteLine(commandResponse);
}
}
}
}
}
Linux 上的输出,451 超时...
但是,如果我将服务器地址更改为 ASPMX.L.GOOGLE.com,那么该应用程序将按预期在 Windows 和 Linux.
上运行
控制台应用程序以 .net5.0 为目标,但也尝试使用 .net3.1 并获得相同的结果。我也尝试过 运行 在 Linux 虚拟机上 Docker 在云中使用它,但也得到了相同的结果。
与 Linux 上的 StreamWriter/NetworkStream 是否存在差异(与 Windows 相比),更具体地说,为什么我在使用 Google 服务器时没有遇到同样的问题?
我想知道...这就像行尾增量一样简单吗? Windows 和 Linux 具有不同的 Environment.NewLine
值。也许尝试显式添加 \r\n
(因为 Windows 似乎有效),而不是依赖本地 OS 行尾?
clearTextWriter.Write("HELO domain.com\r\n");
此外:尝试添加显式刷新 - clearTextWriter.Flush();
.
至于为什么 Google 服务器工作:也许它接受的内容更宽容,因为第一个服务器更精确地遵循规范,并且该规范大概说消息被终止\r\n
。或者规范有歧义,Google就选择了宽容。
顺便说一句:出于类似的原因,最好在此处明确指定 Encoding
,大概是 UTF8。
以下控制台应用程序在 Windows 上工作正常,但是当我 运行 它在 WSL 中或作为 Linux Docker 容器时,我从服务器收到超时。
using System;
using System.IO;
using System.Net.Sockets;
namespace ClientTest
{
class Program
{
static void Main(string[] args)
{
const string server = "inbound-smtp.us-west-2.amazonaws.com";
const int port = 25;
Console.WriteLine($"Connecting to: {server}");
using (var client = new TcpClient(server, port))
{
using (NetworkStream stream = client.GetStream())
using (StreamReader clearTextReader = new StreamReader(stream))
using (StreamWriter clearTextWriter = new StreamWriter(stream) { AutoFlush = true })
{
// read connection response
var connectResponse = clearTextReader.ReadLine();
Console.WriteLine(connectResponse);
// send command
Console.WriteLine($"HELO domain.com");
clearTextWriter.WriteLine("HELO domain.com");
// read command response
var commandResponse = clearTextReader.ReadLine();
Console.WriteLine(commandResponse);
}
}
}
}
}
Linux 上的输出,451 超时...
但是,如果我将服务器地址更改为 ASPMX.L.GOOGLE.com,那么该应用程序将按预期在 Windows 和 Linux.
上运行控制台应用程序以 .net5.0 为目标,但也尝试使用 .net3.1 并获得相同的结果。我也尝试过 运行 在 Linux 虚拟机上 Docker 在云中使用它,但也得到了相同的结果。
与 Linux 上的 StreamWriter/NetworkStream 是否存在差异(与 Windows 相比),更具体地说,为什么我在使用 Google 服务器时没有遇到同样的问题?
我想知道...这就像行尾增量一样简单吗? Windows 和 Linux 具有不同的 Environment.NewLine
值。也许尝试显式添加 \r\n
(因为 Windows 似乎有效),而不是依赖本地 OS 行尾?
clearTextWriter.Write("HELO domain.com\r\n");
此外:尝试添加显式刷新 - clearTextWriter.Flush();
.
至于为什么 Google 服务器工作:也许它接受的内容更宽容,因为第一个服务器更精确地遵循规范,并且该规范大概说消息被终止\r\n
。或者规范有歧义,Google就选择了宽容。
顺便说一句:出于类似的原因,最好在此处明确指定 Encoding
,大概是 UTF8。