2012-06-08 129 views
2

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

我已经完成了第一部分(发送通过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 
# } 

但我无法查找/添加/创建他们只发出这样的请求后,接收响应代码。任何人都可以帮助我吗?

谢谢。

回答

0

谢谢,我终于有下面的代码:

# 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)' 
+0

不足。您忽略了接收方法返回的返回值,即EOS指示,错误指示或接收数据的长度。相反,您假设读取已填充整个缓冲区。你不能假设与TCP。 – EJP

+0

EJP,谢谢你的好评。我无法在此评论中发布相关代码,因此会为此创建单独的答案。 – TShark