首页 > 其他分享 >19.13 Boost Asio 发送TCP流数据

19.13 Boost Asio 发送TCP流数据

时间:2023-11-08 13:32:00浏览次数:28  
标签:Asio std ios namespace tcp TCP 19.13 using ptr

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] != '\0')
    {
      std::cout << buffer[x];
    }
  }
  delete[] buffer;
}

// 每次读入一行,并输出
void ReadLineFileA(std::string filename)
{
  std::ifstream ptr(filename);
  std::string string;
  while (std::getline(ptr, string))
  {
    std::cout << string.c_str() << std::endl;
  }
}

void ReadLineFileB(std::string filename)
{
  char buffer[1024];
  std::fstream ptr;

  ptr.open(filename, std::ios::in | std::ios::binary);

  if (ptr.is_open() == true)
  {
    while (!ptr.eof())
    {
      // 该行长度到达1024或者遇到\n则结束
      ptr.getline(buffer, 1024, '\n');
      std::cout << buffer << std::endl;
    }
  }
}

// 获取文本总行数
int GetFileLine(std::string filename)
{
  char buffer[1024];
  std::fstream ptr;
  int line_count = 0;

  ptr.open(filename, std::ios::in | std::ios::binary);

  if (ptr.is_open() == true)
  {
    while (!ptr.eof())
    {
      ptr.getline(buffer, 1024, '\n');
      line_count = line_count + 1;
    }
  }
  return line_count;
}

int main(int argc, char *argv[])
{
  std::string file_path = "d://lyshark.txt";

  // 获取行号
  int count = GetFileLine(file_path);
  std::cout << "行数: " << count << std::endl;

  // 发送数据流
  io_service io;
  ip::tcp::endpoint ep(ip::tcp::v4(), 6666);
  ip::tcp::acceptor acceptor(io, ep);

  std::ifstream ptr(file_path);
  std::string get_string;
  while (std::getline(ptr, get_string))
  {
    ip::tcp::iostream tcp_stream;
    acceptor.accept(*tcp_stream.rdbuf());
    tcp_stream << get_string.c_str();
  }

  std::system("pause");
  return 0;
}

与服务端相比,客户端的代码则显得非常简单,在代码中我们只需要通过ip::tcp::iostream tcp_stream链接到服务端,并通过调用getline即可每次在流中获取一行数据,由于我们循环了3次,所有也就是只读取前三行。

#include <iostream>
#include <boost/asio.hpp>

using namespace std;
using namespace boost::asio;
using namespace boost::system;

int main(int argc, char *argv[])
{
  // 循环从流中读入,前三行
  for (int i = 0; i < 3; ++i)
  {
    ip::tcp::iostream tcp_stream("127.0.0.1", "6666");
    string str;
    getline(tcp_stream, str);
    cout << str << endl;
  }

  std::system("pause");
  return 0;
}

读者可自行编译并运行上述代码片段,则可看到如下图所示的输出信息;

标签:Asio,std,ios,namespace,tcp,TCP,19.13,using,ptr
From: https://blog.51cto.com/lyshark/8249993

相关文章

  • 19.6 Boost Asio 文本压缩传输
    Base64是一种二进制到文本的编码方案,用于将二进制数据转换为ASCII字符串格式。它通过将二进制数据流转换为一系列64个字符来工作,这些字符都可以安全地传输到设计用于处理文本数据的系统中。如下代码中我们使用Boost中提供的base64_from_binary头文件实现两个函数,其中Base64Decode......
  • 20.TCP连接
    20.TCP连接学习目标▶掌握三次握手建立连接过程▶掌握四次握手关闭连接的过程▶掌握滑动窗口的概念▶掌握错误处理函数封装▶实现多进程并发服务器▶实现多线程并发服务器1.三次握手和四次挥手  思考:为什么TCP是面向连接的安全可靠的传输????  TCP是面向连接的安......
  • 常见面试题-TCP三次握手四次挥手
    TCP三次握手/四次挥手参数用途SYN用于启动和建立连接时,同步设备之间的序列号。0到2^32-1的随机数。ACK向另一端确认已经收到SYN,数值为收到SYN增一。SYN-ACK确认之前收到了SYN,数值为自定义值。FIN终止连接。RST重置连接。三次握手三次握手流程为:第一次握手:client请求建立连......
  • 聊一聊 tcp/ip 在.NET故障分析的重要性
    一:背景1.讲故事这段时间分析了几个和网络故障有关的.NET程序之后,真的越来越体会到计算机基础课的重要,比如计算机网络课,如果没有对tcpip协议的深刻理解,解决这些问题真的很难,因为你只能在高层做黑盒测试,你无法看到tcp层面的握手和psh通讯。这篇我们通过两个小例子来理解一......
  • 19.7 Boost Asio 传输序列化数据
    序列化和反序列化是指将数据结构或对象转换为一组字节,以便在需要时可以将其存储在磁盘上或通过网络传输,并且可以在需要时重新创建原始对象或数据结构。序列化是将内存中的对象转换为字节的过程。在序列化期间,对象的状态被编码为一组字节,并可以保存或传输到另一个位置。序列化后的......
  • 你真的知道TCP协议中的序列号确认、上层协议及记录标识问题吗?
    引言在前面的内容中,我们已经详细讲解了一系列与TCP相关的面试问题。然而,这些问题都是基于个别知识点进行扩展的。今天,我们将重点讨论一些场景问题,并探讨如何解决这些问题。序列号确认问题当A主机与B主机建立了TCP连接后,A主机发送了两个TCP报文,分别大小为500和300字节。第一个报......
  • Daleks' Invasion 题解
    Daleks'Invasion题目大意给定一张无向带权图,对于每条边求一个最大的\(x\),使得将这条边的边权修改为\(x\)后这条边能位于这张图的最小生成树上。思路分析没事干了就把之前写过的题拉出来水题解。我们先把原图的最小生成树求出来,考虑每条边\((u,v)\),分类讨论:如果这条边......
  • 08. 并发TCP服务器
    一、并发TCP服务器  我们使用线程的方式实现并发TCP服务器。fromsocketimportsocketfromsocketimportAF_INET,SOCK_STREAM,SOL_SOCKET,SO_REUSEADDRfromtimeimportctimefromthreadingimportThreadHOST="127.0.0.1"PORT=8080ADDRESS=(HOST,PORT......
  • TCP协议:超时重传、流量控制、keep-alive和端口号,你真的了解吗?
    引言在之前的讲解中,我们已经介绍了TCP协议的一些面试内容,相信大家对于TCP也有了一些新的了解。今天,我们将继续深入探讨TCP的超时重传、流量控制、TCP的keepalive机制以及端口号等相关信息。这些内容对于理解TCP协议的工作原理和实际应用非常重要,希望可以加深大家对TCP协议的理解......
  • TCP三次握手的机制
    工作原理描述1)客户端主动向服务器端发送请求SYN(SynchronizeSequenceNumbers),发送SYN=1,seq=n(随机序号)2)服务器端接收到请求后,进行确认,回复SYN=1,ACK=n+1(确认),seq=k(随机序号)3)客户端进行确认,回复SYN=1,ACK=k+1(确认),seq=n+1为什么需要三次握手TCP(transmissioncontrolprotocol)是可靠......