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

时间:2014-08-14 13:00:52

标签: c++ boost boost-asio

我正在尝试将.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";

}

1 个答案:

答案 0 :(得分:0)

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");
}