【问题标题】:Does NetworkStream with StreamWriter behave differently on Linux?带有 StreamWriter 的 NetworkStream 在 Linux 上的行为是否不同?
【发布时间】:2020-11-19 21:58:37
【问题描述】:

以下控制台应用程序在 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);

                }
            }
        }
    }
}

在 Windows 上输出 250 成功...

在 Linux 上输出 451 超时...

但是,例如,如果我将服务器地址更改为 ASPMX.L.GOOGLE.com,则该应用程序在 Windows 和 Linux 上可以正常运行。

控制台应用程序以 .net5.0 为目标,但也尝试使用 .net3.1 并获得了相同的结果。我还尝试在带有云中 Docker 的 Linux VM 上运行它,但也得到了相同的结果。

Linux 上的 StreamWriter/NetworkStream 是否存在差异(与 Windows 相比),更具体地说,为什么我在使用 Google 服务器时没有遇到相同的问题?

【问题讨论】:

    标签: c# .net-core windows-subsystem-for-linux networkstream .net-5


    【解决方案1】:

    我想知道...这是否像行尾增量一样简单? Windows 和 Linux 有不同的 Environment.NewLine 值。也许尝试显式添加 \r\n(因为 Windows 似乎可以工作),而不是依赖本地操作系统的行尾?

    clearTextWriter.Write("HELO domain.com\r\n");
    

    另外:尝试添加显式刷新 - clearTextWriter.Flush();

    至于为什么谷歌服务器工作:也许它在接受什么方面更宽容,因为第一个服务器更精确地遵循规范,并且该规范大概说消息由\r\n 终止。或者规范可能是模棱两可的,而 Google 只是选择了宽容。

    顺便说一句:出于类似原因,最好在此处明确指定 Encoding,可能是 UTF8。

    【讨论】:

    • 谢谢 Marc,我已经尝试过显式刷新并设置编码,因为我认为这可能是问题所在。没试过 \r\n 但不幸的是,它没有用,仍然得到 451 Timeout。
    • 马克,我收回来......你是对的!我删除了 UTF8 编码,现在我在添加 \r\n 时获得了 250 成功。谢谢
    猜你喜欢
    • 2010-11-27
    • 2013-11-21
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多