头文件
#pragma once
#ifndef TCP_CLIENT_H
#define TCP_CLIENT_H
#include <boost/asio.hpp>
#include <string>
using namespace boost;
class TcpClient
{
public:
TcpClient(const std::string& ipStr, int port);
private:
std::string ip_str_;
int port_;
asio::ip::tcp::socket* sock_;
asio::io_service ios_;
public:
bool connect();
virtual ~TcpClient();
void writeToSocket(const std::string& buf);
void writeToSocket(const char* buf, int length);
void readFromSocket(char* buf, int length);
};
#endif
cc文件
#include "TcpClient.h"
#include <iostream>
#include <cstdlib>
TcpClient::TcpClient(const std::string& ipStr, int port)
:ip_str_(ipStr),
port_(port)
{
}
bool TcpClient::connect()
{
try {
asio::ip::tcp::endpoint
ep(asio::ip::address::from_string(ip_str_),
port_);
sock_ = new asio::ip::tcp::socket(ios_, ep.protocol());
sock_->connect(ep);
}
catch (system::system_error &e) {
std::cout << "Error occured! Error code = " << e.code()
<< ". Message: " << e.what();
//return e.code().value();
return false;
}
return true;
}
void TcpClient::writeToSocket(const char* buf, int length)
{
std::size_t total_bytes_written = 0;
while (total_bytes_written != length)
{
total_bytes_written += sock_->write_some(
asio::buffer(buf + total_bytes_written,
length - total_bytes_written));
}
}
void TcpClient::writeToSocket(const std::string& buf)
{
std::size_t total_bytes_written = 0;
while (total_bytes_written != buf.length())
{
total_bytes_written += sock_->write_some(
asio::buffer(buf.c_str() +
total_bytes_written,
buf.length() - total_bytes_written));
}
}
void TcpClient::readFromSocket(char* buf, int length)
{
std::size_t total_bytes_read = 0;
try
{
while (total_bytes_read != length)
{
total_bytes_read += sock_->read_some(
asio::buffer(buf + total_bytes_read, length - total_bytes_read));
}
}
catch (system::system_error &e) {
std::cout << "Error occured! Error code = " << e.code()
<< ". Message: " << e.what();
}
}
TcpClient::~TcpClient()
{
}