Boost框架中默认就提供了针对TCP流传输的支持,该功能可以用来进行基于文本协议的通信,也可以用来实现自定义的协议。一般tcp::iostream
会阻塞当前线程,直到IO操作完成。
首先来看服务端代码,如下所示在代码中首先通过GetFileSize
读取文件行数,当有了行数我们就可以使用循环的方式依次调用acceptor.accept(*tcp_stream.rdbuf())
接收客户端的相应请求,并使用<<
符号向建立了链接的文件内追加字符串数据。
#include <iostream>
#include <fstream>
#include <boost/asio.hpp>
using namespace std;
using namespace boost;
using namespace boost::asio;
// 利用流获取文件大小
long GetFileSize(std::string filename)
{
long ref_kb;
std::ifstream ptr(filename, std::ios::in | std::ios::binary);
if (ptr.is_open() == true)
{
ptr.seekg(0, std::ios::end); // 移动到末尾
ref_kb = ptr.tellg(); // 获取字节数
ptr.close();
return ref_kb;
}
return 0;
}
// 一次性读入,并循环输出
void ReadAllFile(std::string filename)
{
char *buffer;
long size;
std::ifstream ptr(filename, std::ios::in | std::ios::binary | std::ios::ate);
size = ptr.tellg();
std::cout << "总大小: " << size << std::endl;
ptr.seekg(0, std::ios::beg);
buffer = new char[size];
ptr.read(buffer, size);
ptr.close();
// 循环输出逐字节输出
for (int x = 0; x < size; x )
{
if (buffer[x] != '