【发布时间】:2018-12-05 21:31:34
【问题描述】:
我正在编写一个客户端应用程序,它必须通过 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 调整。 任何人都可以建议可能是什么问题,并最终提出解决方案。
提前致谢,
朱利安·迪米特洛夫
【问题讨论】:
-
您是否进行了测试以检查您对 WaitOne 和 TimeSpan 的假设?
-
WaitOne 将
TimeSpan作为超时值,而不是等待时间。您正在等待异步任务(连接)完成。您的连接是成功的,所以它会在连接建立后立即完成。 -
WaitOne()' called on a ManualResetEvent on both Win and Linux act the same. Before I useTimeSpan` 我刚刚输入2000的毫秒数 - 在两个操作系统上的结果相同 -
@Julian BeginConnect 返回一个 IAsyncResult。 ManualResetEvent.WaitOne 的文档表明这是一个延迟,而 WaitHandle.WaitOne 表明这是一个超时。
-
应用结构的灵感来自this问题的答案。我找不到在
IAsyncResult上与.BeginConnect方法分开测试WaitHandle.WaitOne的方法。我仍然找不到合理的答案,为什么它适用于 Windows 而不是 Linux...
标签: c# linux windows asp.net-core .net-core