繁体   English   中英

通过Boost ASIO TCP发送文件,如何将char数组流式传输到套接字?

[英]Send file Via Boost ASIO TCP, how to stream char array to socket?

我正在尝试将.NET代码转换为C ++,但我对C ++还是陌生的。 下面是我的.NET代码。 我在转换时遇到的主要问题是将文件读取到正确的字节数组中,获取长度,然后流式传输到套接字。

                Dim bmp As Byte() = File.ReadAllBytes(strImagePath)
                Dim client As New TcpClient("192.168.1.13", 10555)
                Dim stream As NetworkStream = client.GetStream()
                Dim lenbuffer As Byte() = BitConverter.GetBytes(bmp.Length)
                stream.Write(lenbuffer, 0, lenbuffer.Length)
                stream.Write(bmp, 0, bmp.Length)
                stream.Flush()

                Dim response As Byte() = New Byte(9999) {}
                Dim totalread As Integer = 0
                Dim read As Integer = 1
                While read <> 0
                    read = stream.Read(response, 0, response.Length - totalread)
                    totalread += read
                End While


                strAnswer = encoding.ASCII.GetString(response, 0, totalread)

使用下面的C ++代码,我对如何将char数组流式传输到套接字感到困惑。

char* readFileBytes(const char *name)
{
ifstream fl(name);
fl.seekg( 0, ios::end );
size_t len = fl.tellg();
char *ret = new char[len];
fl.seekg(0, ios::beg);
fl.read(ret, len);
 fl.close();
 return ret;
}

void SendImage(std::string strImageFile)
{

strImageFile = "/tmagent/images/1.gif";


char* FileData = readFileBytes(strImageFile.c_str());

boost::system::error_code ec;


boost::asio::io_service io_service;

boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query("192.168.1.13", "10555");
boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
boost::asio::ip::tcp::resolver::iterator end;

boost::asio::ip::tcp::socket socket(io_service);

boost::asio::connect(socket, endpoint_iterator);


boost::asio::streambuf request;
std::ostream requestStream(&request);


//What do I do here to stream the file data?


boost::asio::write(socket, request);

boost::asio::streambuf respond;

boost::asio::read(socket, respond, completion, ec);

std::string strOutput;

strOutput = boost::asio::buffer_cast<const char*>(respond.data());
respond.consume(strOutput.size());
cout << "START OUTPUT: " << strOutput << "\n";

}

Boost.Asio具有许多重载的buffer()函数,这些函数使各种数据容器适应于ConstBufferSequence概念模型,该模型被write函数接受。

因此,您甚至不必使用streambuf ,只需直接发送数据即可:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <boost/asio.hpp>

using std::vector;
using std::string;

vector<char> readFileBytes(const string &name)
{
  using namespace std;
  ifstream fl(name);
  fl.seekg( 0, ios::end );
  size_t len = fl.tellg();
  vector<char> ret(len);
  fl.seekg(0, ios::beg);
  if (len)
    fl.read(&ret[0], len);
  fl.close();
  return move(ret);
}

void SendImage(const string &strImageFile)
{
  using namespace boost::asio;
  boost::system::error_code ec;
  io_service io_service;
  ip::tcp::resolver resolver(io_service);
  ip::tcp::resolver::query query("192.168.1.13", "10555");
  ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
  ip::tcp::socket socket(io_service);
  connect(socket, endpoint_iterator);

  auto bytes = move(readFileBytes(strImageFile));
  write(socket, buffer(bytes), ec);

  streambuf respond;
  read(socket, respond, ec);
  string strOutput;
  strOutput = buffer_cast<const char*>(respond.data());
  respond.consume(strOutput.size());
  std::cout << "START OUTPUT: " << strOutput << "\n";
}

int main()
{
  SendImage("/tmagent/images/1.gif");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM