【问题标题】:Send/receive byte arrays via TCP通过 TCP 发送/接收字节数组
【发布时间】:2022-05-03 21:03:10
【问题描述】:

我的目标是向/从服务器应用程序发送和接收简单的字节数组(简单的 Java 工具,以 30 个字节向所有请求返回固定响应)。

我已经使用以下代码完成了第一部分(通过 TCP 发送字节数组):

 # Define port and target IP address 
  [int] $Port = 2222
  $IP = "172.16.0.51"
  $Address = [system.net.IPAddress]::Parse($IP) 

  # Create IP Endpoint 
  $End = New-Object System.Net.IPEndPoint $address, $port 

  # Create Socket 
  $Saddrf = [System.Net.Sockets.AddressFamily]::InterNetwork 
  $Stype = [System.Net.Sockets.SocketType]::Stream 
  $Ptype = [System.Net.Sockets.ProtocolType]::TCP
  $Sock = New-Object System.Net.Sockets.Socket $saddrf, $stype, $ptype 
  $Sock.TTL = 26 

  # Connect to socket 
  $sock.Connect($end)

  # Create byte array
  # TCP [Byte[]] $Message = 0xAA,0x55,0x00,0x12,0x00,0x00,0x00,0x7B,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0xD6,0xDE,0xD5,0xA7,0x14,0x00
  [Byte[]] $Message = 0xAA,0x55,0x00,0x12,0x00,0x00,0x00,0x7B,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0xD6,0xDE,0xD5,0xA7,0x14,0x00

 # for ($i=0; $i -le 1000; $i++)
 # {
  # Send the byte array 
  $Sent = $Sock.Send($Message)
  "{0} characters sent to: {1} " -f $Sent,$IP
  "Message is: $Message" 
  # End of Script
 # }

但我无法在发送此类请求后找到/添加/创建能够接收响应的代码。谁能帮我解决这个问题?

谢谢。

【问题讨论】:

    标签: powershell tcp


    【解决方案1】:

    查看System.Net.Sockets.Socket class on MSDN 的文档。该类具有各种Receive 方法,您可以使用这些方法从流中读取数据。

    【讨论】:

      【解决方案2】:

      谢谢,终于有如下代码了:

      # Getting responses  
          $script:compare = new-object System.Byte[] 40  
          $end = 0  
          do  
          {  
                  # Receive response  
              Start-Sleep -m 30  
              $buffer = new-object System.Byte[] 40  
              $Received = $Sock.Receive($buffer)  
              if (@(Compare-Object $buffer $compare).length -ne 0)  
              {     
                  Write-Host "TCP Message received:" $buffer  
                  # Encode received response to ASCII  
                  $Encode = new-object "System.Text.ASCIIEncoding"  
                  $test = $Encode.GetString($buffer)  
                  Add-Content -value "$(Time) $test" -Path tcp_response.log  
                  $end = 1  
              }  
          } while ($end -eq 0)'
      

      【讨论】:

      • 不足。您忽略了接收方法返回的返回值,它可以是 EOS 指示、错误指示或接收到的数据的长度。相反,您假设读取已填满整个缓冲区。你不能假设使用 TCP。
      • EJP,谢谢您的好评。我无法在此评论中发布相关代码,因此将为此创建一个单独的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      相关资源
      最近更新 更多