【问题标题】:Can only either receive or send via TCP只能通过 TCP 接收或发送
【发布时间】:2015-10-07 14:17:02
【问题描述】:

我在编写可以通过 TCP 连接发送和接收数据的 PowerShell 脚本时遇到问题。它似乎只让我做一个或另一个。

以下是我目前所拥有的。我想听并等待连接,然后一旦建立,接收一个包含 IP 地址的字符串,做一些花哨的查找以查看登录到该机器的用户,然后发回用户名。如果我只发送数据,它可以工作。如果我只接收数据,它就可以工作。如果我尝试两者都做,则只有接收有效。我做错了什么?

$port = 1234

do {
  $user = ""

  $endpoint = new-object System.Net.IPEndPoint ([system.net.ipaddress]::any, $port)
  $listener = new-object System.Net.Sockets.TcpListener $endpoint
  $listener.start()

  $client = $listener.AcceptTcpClient() # will block here until connection
  $stream = $client.GetStream();

  $reader = New-Object System.IO.StreamReader $stream
  $writer = New-Object System.IO.StreamWriter $stream

  $add = $reader.ReadLine()
  #$reader.close()

  write-host "Request from " $add

  if($add) {
    $user = & wmic /Node:$add ComputerSystem Get UserName
    write-host "User returned is " $user[2]
  }

  if($user[2] -eq "ERROR:") {
    $user[2] = "ErrNoUserW"
  } elseif(!$user[2]) {
    $user[2] = "ErrServerW"
  }

  $writer.Write($user[2])

  #$writer.close()
  $stream.close()
  $client.close()
  $listener.stop()
} while(1)

【问题讨论】:

  • 您可以将客户端脚本发布到吗?
  • 现在我正在使用 Ncat(来自 Nmap 套件)进行测试。因此,如果您执行“/path/to/ncat ip_address port_number”,然后只需输入一个 IP 并按 Enter,它将以用户名响应(或者,无论如何,这就是想法。客户端永远不会看到响应)。
  • 尝试$writer.Flush()
  • 太棒了!谢谢你。就是这样!
  • 附带说明,不要在 PowerShell 脚本中使用 wmic。改用Get-WmiObject$user = (Get-WmiObject -Computer $add -Class Win32_ComputerSystem).UserName

标签: sockets powershell tcp


【解决方案1】:

我认为流只能在任何给定时间读取或写入。您是否尝试过关闭流然后重新打开它?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多