使用boost实现tcp server/client

本文介绍了一个基于Boost.Asio库的TCP客户端与服务器的实现方案。客户端能够与服务器建立连接并进行异步读写操作。服务器端则通过两个端口分别负责接收数据和发送数据,实现了客户端与服务器之间的双向通信。

tcp client

CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(Tcp_client VERSION 0.1.0)

#boost相关部分
find_package(Boost 1.77.0 COMPONENTS context thread date_time program_options filesystem system coroutine log_setup log REQUIRED)
if(Boost_FOUND)
  message("boost found")
  include_directories(${
   
   Boost_INCLUDE_DIRS})
  link_directories(${
   
   Boost_LIBRARY_DIRS})
else()
  message("boost not found")
endif()
#boost相关部分

#预定义_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING
add_compile_definitions(_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING)
add_compile_definitions(BOOST_BIND_GLOBAL_PLACEHOLDERS)

add_executable(Tcp_client main.cpp)

target_link_libraries(${
   
   PROJECT_NAME} 
libboost_thread.a 
libboost_filesystem.a 
libboost_log_setup.a 
libboost_log.a 
libboost_locale.a
libboost_coroutine.a 
libboost_context.a
pthread
)

main.cpp

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

using namespace boost::asio;

class Tcp_Client
{
   
   
public:
    Tcp_Client(io_service& io_service, ip::tcp::endpoint ep):ios(io_service)
    {
   
   
        ptr_socket_.reset(new ip::tcp::socket(io_service));

        boost::system::error_code ec;
        ptr_socket_->connect(ep, ec);
        if(ec)
        {
   
   
            std::cerr << "Error connecting to server: " << ec.message() << std::endl;
            bConnected = false;
            return;
        }
        bConnected = true;
    }

    void Async_read()
    {
   
   
        memset(data_.data(), 0, sizeof(data_));
        ptr_socket_->async_read_some(buffer(data_), [this](const boost::system::error_code &ec, size_t bytes) {
   
   
            if(!ec)
            {
   
   
                std::cout<<"recv size:"<<bytes<<std::endl;
                std::cout<<"recv data:"<<data_.data()<<std::endl;
                Async_read();
            }
            else if(ec == error::eof)
            {
   
   
                // 断开连接
                bConnected = false;
                std::cout<<"disconnected !"<<std::endl;
            }
            else
            {
   
   
                std::cout<<"read error: "<<ec.message()<<std::endl;
            }
        });
    }

    void Async_write(std::string message)
    {
   
   
        if(message.empty() || !bConnected)
        {
   
   
            return;
        }

        async_write(*ptr_socket_, buffer(message.c_str(), message.size()), [this](const boost::system::error_code &ec, size_t writed_bytes)
		{
   
   
			if (!ec)
			{
   
   
			
			}
            else
            {
   
   
                std::cout <<"send error:"<<ec.message() << std::endl;
                bConnected = false;
            }
		});
    } 

private:
    bool bConnected;
    io_service &ios;
    std::shared_ptr<ip::tcp::socket> ptr_socket_;

    std::array<char, 1024> data_;
};

int main(int argc, char **argv)
{
   
   
    if(argc < 3)
    {
   
   
        std::cerr<<"Few parameter !"<<std::endl;
        std::cerr <<"please input parameter: server_ip  server_port"<< std::endl;
        return 0;
    }

    std::string ip =<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值