【问题标题】:System.Net.Sockets.TcpClient slow in powershellSystem.Net.Sockets.TcpClient 在 powershell 中运行缓慢
【发布时间】:2017-02-24 02:58:43
【问题描述】:
try
{
  $tcp = new-object System.Net.Sockets.TcpClient

  $tcp.ReceiveTimeout = 500
  $tcp.SendTimeout = 500

  $tcp.Connect('127.0.0.1',80)
  Write-Host "Connection possible!"
  $tcp.close()
}
catch
{
    Write-Host "Cannot connect!"
    $_.Exception.Message
}

Measure-Command - 21 秒(总是 21 秒!)

If $tcp.Connect('127.0.0.1',80,$Null)

Measure-Command - 10 毫秒

为什么?

我知道不应该有 $Null 参数,但为什么它很快?

【问题讨论】:

标签: .net powershell


【解决方案1】:

我知道不应该有 $Null 参数,但为什么它很快?

因为你的代码坏了。

try 
{

}
catch
{
}

正在捕捉每一个可能的错误,并隐藏错误消息

您的第一个代码,错误是真正的 TCP 连接在等待约 30 秒后超时,连接确实失败了。

您的第二个代码,错误是“无法找到需要 3 个参数的 Connect 的重载” - 但是您隐藏了错误并且 错误地 打印“无法连接” .这是在误导你。不是更快,是坏了。


发送和接收超时不是针对连接的,它们是发送和接收数据的方法的超时。无法使用.connect() 方法更改连接超时,您需要在没有自己超时的情况下进行异步连接。

例如How to set the timeout for a TcpClient?How to configure socket connect timeout(都是 C#,但仍然是 .Net,这些想法适用于 PowerShell)。

而这个https://superuser.com/questions/805621/test-network-ports-faster-with-powershell 有一个PowerShell 的答案

【讨论】:

  • 谢谢,如果 (!$tcp.ConnectAsync("234234", 80).Wait(500)) {'fail'} 解决了所有问题
【解决方案2】:

$tcp.Connect('127.0.0.1',80,$Null) 抛出异常 Cannot find an overload for "Connect" and the argument count: "3". 在这里阅读更多:MDSN Documentation

【讨论】:

  • 我明白了。但为什么它与 $null 一起工作得很快?我的意思是,如果端口真的没问题,它双向工作都很快。如果不是 - 只有 $Null 变体可以快速运行
  • 我不知道。在我的电脑上,这段代码在几毫秒后结束
  • @IgorKuznetsov 是成功还是错误?我认为 Endorphinex 的重点是代码结束得很快,因为它出错了,而不是它返回了有效的结果。
  • 也许,用$Null PS 看到它,并立即抛出异常,但没有$Null 它必须等到它连接到这个地址...
  • 找到解决方案。 IP 地址附近不应有引号。 '127.0.0.1' 工作 21 秒.... $tcp.Connect(127.0.0.1,80) 工作 7 毫秒 :))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2021-11-25
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多