【问题标题】:Powershell TCP Send Entire FilePowershell TCP 发送整个文件
【发布时间】:2013-08-27 05:04:18
【问题描述】:

我正在尝试通过 TCP 套接字发送文件,但它只发送前 1024 个字节,我试图查看 c# 代码但无法弄清楚。如果有帮助,该文件是二进制格式 有人可以告诉我我缺少什么吗?

客户

$test=[io.file]::ReadAllBytes("c:\test");
$socket = New-Object net.sockets.tcpclient('192.168.1.202',8080);
$stream = $socket.GetStream();
$stream.write($test,0,$test.Length);
$writer.flush();
$socket.close()

服务器

#!/usr/bin/env ruby
require 'socket'
begin
  server = TCPServer.open(8080)
  client = server.accept
  recv_length = 1024
  out_put = ''
  while (tmp = client.recv(recv_length))
    out_put += tmp
    break if tmp.length < recv_length
  end
  File.open("test.txt",'w') {|f| f.write(out_put)}
  server.close
end

旁注如果我尝试对 $test 进行 Base64 编码,它很合适,甚至不会尝试发送任何数据。

编辑:

以下作品。我将服务器更改为 gets 而不是 recv 现在它只是拉取所有内容并等待客户端关闭套接字。

客户

$test=[System.Convert]::ToBase64String([io.file]::ReadAllBytes("c:\test"));
$socket = New-Object net.sockets.tcpclient('172.26.4.26',8080);
$stream = $socket.GetStream();
$writer = new-object System.IO.StreamWriter($stream);
$buffer = new-object System.Byte[] 1024;
$writer.WriteLine($test);
$socket.close()

服务器

#!/usr/bin/env ruby
require 'socket'
require 'base64'
begin
  server = TCPServer.open(8080)
  client = server.accept
  out_put = client.gets()
  File.open("test","w") {|f| f.write(Base64.decode64(out_put))}
end

【问题讨论】:

    标签: c# powershell tcp


    【解决方案1】:

    客户

    $test=[System.Convert]::ToBase64String([io.file]::ReadAllBytes("c:\test"));
    $socket = New-Object net.sockets.tcpclient('172.26.4.26',8080);
    $stream = $socket.GetStream();
    $writer = new-object System.IO.StreamWriter($stream);
    $buffer = new-object System.Byte[] 1024;
    $writer.WriteLine($test);
    $socket.close()
    

    服务器

    #!/usr/bin/env ruby
    require 'socket'
    require 'base64'
    begin
      server = TCPServer.open(8080)
      client = server.accept
      out_put = client.gets()
      File.open("test","w") {|f| f.write(Base64.decode64(out_put))}
    end
    

    【讨论】:

      【解决方案2】:

      我只能猜测,但可能与服务器代码有关?!

       recv_length = 1024
      

      编辑:

      您可以尝试关闭流,也许这就是问题所在?!

      $stream.write($test,0,$test.Length);
      $stream.close();
      $writer.flush();
      

      【讨论】:

      • 不幸的是,while 循环不会获取所有数据,然后在所有数据收集完毕后将其写入文件。但作为一项测试,我已经尝试将它提高到 2048,但它只得到 1024,所以它必须与 powershell(客户端)有关。
      • 关闭流也不会改变输出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多