异步TcpClient Connect在Windows和Linux上部署时有所不同

时间:2018-06-27 05:30:37

标签: c# linux windows asp.net-core .net-core

我正在编写一个客户端应用程序,该应用程序必须通过TCP套接字连接到服务器应用程序。选择的框架是.NET Core 2.0(它不是ASP.NET Core,它只是一个控制台应用程序)。我正在使用TcpClient类及其.BeginConnect().EndConnect()方法,以便能够设置连接超时。这是代码:

public class Program
{
    public static void Main(String[] args)
    {
        var c = new TcpClient();
        int retryCount = 0;
        var success = false;
        IAsyncResult res;
        do
        {
            if (retryCount > 0) Console.WriteLine("Retry: {0}", retryCount);
            retryCount++;
            c.Close();
            c = new TcpClient();
            res = c.BeginConnect("10.64.4.49", 13000, null, null);
            success = res.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2));
            Console.WriteLine(success.ToString());
        }
        while (!c.Connected);

        c.EndConnect(res);
        Console.WriteLine("Connected");
        Console.ReadLine();

    }

当我编译,发布和运行此控制台应用程序时,没有任何内容在监听IP地址和端口,如果该应用程序在Windows或Linux上运行,结果将有所不同。 这是Windows上的结果: On Windows 10 machine

这是Linux上的样子: enter image description here

结果是几乎一样的,唯一的区别是在Windows上它每两秒钟尝试连接一次,但是在Linux上,它的作用就像忽略了这两秒钟,并进行了我所说的“狂暴连接会话”。 我不确定这是Windows预先定义的.NET Core问题还是某些Linux调整。 任何人都可以提出问题的建议,并最终提出解决方案。

预先感谢

朱利安·迪米特洛夫

1 个答案:

答案 0 :(得分:1)

我想我理解您为什么遇到问题,这似乎是基于对超时应该做什么的误解。

为了进行测试,我将您的代码更改为:

dilation_rate

在Windows上,我可以看到连接在大约1秒钟后失败,而在Linux中运行相同的代码,则连接几乎立即失败。如果可以比Windows更快地进行连接,那么Linux似乎可以解决问题。我认为您可能会误解Windows花费的时间来解决它无法与您指定的超时联系起来。

下一步:什么是超时?超时是建立连接可能需要的最大时间。这是一个限制。这意味着操作必须在不到X秒(例如10秒)内完成,否则操作将失败。如果操作在1秒钟内完成,则将立即返回。