我正在编写一个客户端应用程序,该应用程序必须通过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上的结果:
结果是几乎一样的,唯一的区别是在Windows上它每两秒钟尝试连接一次,但是在Linux上,它的作用就像忽略了这两秒钟,并进行了我所说的“狂暴连接会话”。 我不确定这是Windows预先定义的.NET Core问题还是某些Linux调整。 任何人都可以提出问题的建议,并最终提出解决方案。
预先感谢
朱利安·迪米特洛夫
答案 0 :(得分:1)
我想我理解您为什么遇到问题,这似乎是基于对超时应该做什么的误解。
为了进行测试,我将您的代码更改为:
dilation_rate
在Windows上,我可以看到连接在大约1秒钟后失败,而在Linux中运行相同的代码,则连接几乎立即失败。如果可以比Windows更快地进行连接,那么Linux似乎可以解决问题。我认为您可能会误解Windows花费的时间来解决它无法与您指定的超时联系起来。
下一步:什么是超时?超时是建立连接可能需要的最大时间。这是一个限制。这意味着操作必须在不到X秒(例如10秒)内完成,否则操作将失败。如果操作在1秒钟内完成,则将立即返回。