Skip to content

Instantly share code, notes, and snippets.

@jen6
Created October 28, 2015 13:17
Show Gist options
  • Save jen6/84cf1f2c23d4dcdeb699 to your computer and use it in GitHub Desktop.
Save jen6/84cf1f2c23d4dcdeb699 to your computer and use it in GitHub Desktop.
void client::connect(const boost::system::error_code& error)
{
boost::system::error_code ec;
boost::asio::socket_base::keep_alive option(true);
//혹시 타임아웃 때문에 그런가 하고 넣어줬습니다
_socket.set_option(option, ec);
if (ec) {
std::cerr << ec.value() << std::endl;
exit(0);
}
if (!error) {
_socket.async_read_some(
boost::asio::buffer(recv_buf.get()->data(), Packet::MAX_LEN),
boost::bind(&client::read,
this,
asio::placeholders::error)
);
}
}
void client::handle_send(const boost::system::error_code & error) {
_socket.async_read_some(
boost::asio::buffer(recv_buf.get()->data(), Packet::MAX_LEN),
boost::bind(&client::read,
this,
asio::placeholders::error)
);
}
}
void client::send(Packet::packet_ptr& p)
{
_socket.async_write_some(
boost::asio::buffer(p.get()->data(), p.get()->length()),
boost::bind(&client:: handle_send,
this,
asio::placeholders::error)
);
}
void client::read(const boost::system::error_code & error)
{
_socket.async_read_some(
boost::asio::buffer(recv_buf.get()->data(), Packet::MAX_LEN),
boost::bind(&client::handle_read,
this,
recv_buf,
asio::placeholders::bytes_transferred,
asio::placeholders::error)
);
}
void client::handle_read(Packet::packet_ptr p, size_t byte_transfer, const boost::system::error_code & error)
{
if (!error)
{
Packet::Parse(p);
}
_socket.async_read_some(
boost::asio::buffer(recv_buf.get()->data(), Packet::MAX_LEN),
boost::bind(&client::read,
this,
asio::placeholders::error)
);
};
client::client(boost::asio::io_service& io_service, tcp::resolver::iterator endpoint_iterator)
: _io_service(io_service), _socket(io_service), recv_buf(new Packet::Packet)
{
boost::asio::async_connect(_socket, endpoint_iterator,
boost::bind(&client::connect,
this, boost::asio::placeholders::error)
);
}
----------------------------------------------------------------------------------------------------------------------
int main()
{
boost::asio::io_service io;
boost::asio::io_service::work work(io); //send한 후 io_service자체가 죽는것 같아 넣어줬습니다
tcp::resolver resolver(io);
auto endpoint_iterator = resolver.resolve({ "127.0.0.1","999" });
std::thread t1(boost::bind(&boost::asio::io_service::run, &io));
client c(io, endpoint_iterator);
std::random_device rd;
//test case 30
for (auto i = 0; i < 30; ++i)
{
Packet::test t;
unsigned int buf = rd();
t.t = buf;
std::cout << buf << std::endl;
auto p = t.Make_packet();
if (!p) {
std::cout << "packet error" << std::endl;
break;
}
c.send(p);
}
}
@jen6
Copy link
Author

jen6 commented Oct 28, 2015

코드자르다 thread join거는 부분이 잘렸네요
io_service run 해둔 쓰레드는 join걸어뒀습니다

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment