2012-06-08 365 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