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