boost.asio同步TCP客户端封装

头文件

#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()
{
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一尺丈量

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值