boost::asio学习之[四]udp client server 异步server

来源:互联网 发布:js select改变事件 编辑:程序博客网 时间:2024/05/22 07:48
#pragma once#include<boost/array.hpp>#include<boost/system/system_error.hpp>#include <boost/asio.hpp>namespace UdpSyClient{using namespace boost::asio::ip;const int MaxSize = 1024;void udp_sy_client(){try{boost::asio::io_service io;    udp::resolver resolver(io);    udp::resolver::query query(udp::v4(), "localhost", "6677");//protocol type , ip , portudp::endpoint resolver_endpoint = *resolver.resolve(query);    udp::socket socket(io);socket.open(udp::v4());boost::array<char, 1> buf = {{0}};socket.send_to(boost::asio::buffer(buf), resolver_endpoint);boost::array<char, MaxSize> recive_buf;udp::endpoint send_endpoint;size_t len = socket.receive_from(boost::asio::buffer(recive_buf), send_endpoint);std::cout.write(recive_buf.data(), len);}catch (std::exception& e){std::cout << e.what() << std::endl;}}}#pragma once#include <ctime>#include <boost/array.hpp>#include <boost/asio.hpp>namespace UdpSyService{using namespace boost::asio::ip;void udp_sy_server(){try{boost::asio::io_service io;udp::socket socket(io, udp::endpoint(udp::v4(), 6677));for (;;){boost::array<char, 1> rec_buf;boost::system::error_code error;udp::endpoint remote_endpoint;socket.receive_from(boost::asio::buffer(rec_buf), remote_endpoint, 0, error);//if (error && error != boost::asio::error::message_size)throw boost::system::system_error(error);time_t now = std::time(0);std::string message = std::ctime(&now);boost::system::error_code ignore_error;socket.send_to(boost::asio::buffer(message), remote_endpoint, 0, ignore_error);}}catch (std::exception& e){std::cerr << e.what() << std::endl;}}}#pragma once#include <ctime>#include <boost/array.hpp>#include <boost/asio.hpp>namespace UdpAsyService{using namespace boost::asio::ip;class udp_server{public:udp_server(boost::asio::io_service& io):socket_(io, udp::endpoint(udp::v4(), 6677))//tcp::acceport的构造一样{start_recive();}//async_receive_from 函数在后台监听是否有新的请求,当一个请求链接到达时,io_service对象将唤起hand_recive//函数来做相应的处理。hand_recive有两个参数,error参数指示操作是成功还是失败,size参数指示实际接受的字节数。void start_recive(){socket_.async_receive_from(boost::asio::buffer(rec_buf_), remot_endpoint_,boost::bind(&udp_server::hand_receive, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));}private:void hand_receive(const boost::system::error_code& error, std::size_t size){if (!error || error != boost::asio::error::message_size){time_t now = std::time(0);boost::shared_ptr<std::string> message(new std::string(std::ctime(&now)));socket_.async_send_to(boost::asio::buffer(*message), remot_endpoint_,boost::bind(&udp_server::hand_send, this, message, boost::asio::placeholders::error,             boost::asio::placeholders::bytes_transferred));start_recive();//next client;}}void hand_send(boost::shared_ptr<std::string> message, const boost::system::system_error& error, std::size_t size){}private:udp::socket socket_;udp::endpoint remot_endpoint_;boost::array<char, 1> rec_buf_;};void udp_asy_server(){try{boost::asio::io_service io;udp_server server(io);io.run();}catch (std::exception& e){std::cerr << e.what() << std::endl;}}}


0 0
原创粉丝点击