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 =<

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

被折叠的 条评论
为什么被折叠?



