• 同步socket处理


    1.socket类是TCP通信的基本类,调用成员函数connect()可以连接到一个指定的通信端点,连接成功后用local_endpoint()和remote_endpoint()获得连接两端的端点信,用read_some()和write_some()阻塞读写数据,当操作完成后使用close()函数关闭socket。如果不关闭socket,那么在socket析构时也会自动调用close()关闭。
    2.acceptor类对应socketAPI的accept()函数功能,它用于服务器端,在指定的端口号接受连接,必须配合socket类才能完成通信。
    3.resolver类对象socketAPI的getaddrinfo()系列函数,用于客户端解析网址获得可用的IP地址,解析得到的IP地址可以使用socket对象连接。

    服务器端:

    #include <boost/thread.hpp>
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    
    
    int main()
    {
    	try
    	{
    		std::cout << "server start..." << std::endl;
    		boost::asio::io_service ios;
    		boost::asio::ip::tcp::acceptor acceptor(ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 6688)); // 接受6688端口
    		std::cout << acceptor.local_endpoint().address() << std::endl;
    		while (true) // 循环执行服务
    		{
    			boost::asio::ip::tcp::socket sock(ios); // socket对象
    			acceptor.accept(sock); // 阻塞等待socket连接
    			std::cout << "client:";
    			std::cout << sock.remote_endpoint().address() << std::endl;
    			sock.write_some(boost::asio::buffer("hello client...")); // 发送数据
    
    		}
    	}
    	catch (std::exception &e)
    	{
    		std::cout << e.what() << std::endl;
    	}
    	return 0;
    }
    

      

    客户端:

    #include <boost/thread.hpp>
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    #include <vector>
    
    class a_timer
    {
    private:
    	int count, count_max;
    	boost::function<void()> f; // 无参无返回的可调用用
    	boost::asio::deadline_timer t; // 定时器
    public:
    	template<typename F>
    	a_timer(boost::asio::io_service &ios, int x, F func) :
    		f(func), count_max(x), count(0), t(ios, boost::posix_time::millisec(500))
    	{
    		t.async_wait(boost::bind(&a_timer::call_func, this, _1)); // 注册回调函数
    	}
    	void call_func(const boost::system::error_code &e)
    	{
    		if (count > count_max)
    		{
    			return;
    		}
    		++count;
    		f();
    		t.expires_at(t.expires_at() + boost::posix_time::millisec(500));
    		t.async_wait(boost::bind(&a_timer::call_func, this, _1)); // 再次启动定时器
    	}
    };
    
    void client(boost::asio::io_service &ios)
    {
    	try
    	{
    		std::cout << "client start..." << std::endl;
    		boost::asio::ip::tcp::socket sock(ios);
    		boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"), 6688);
    		sock.connect(ep); // socket连接到端点
    		std::vector<char> str(100, 0);
    		sock.read_some(boost::asio::buffer(str)); // 接收数据
    		std::cout << "recive from " << sock.remote_endpoint().address() << ": ";
    		std::cout << &str[0] << std::endl;
    	}
    	catch (std::exception& e)
    	{
    		std::cout << e.what() << std::endl;
    	}
    }
    int main()
    {
    	boost::asio::io_service ios;
    	a_timer t(ios, 5, boost::bind(client, boost::ref(ios)));
    	ios.run();
    	return 0;
    }
    

      

  • 相关阅读:
    管道流
    构造方法中用泛型
    代码实现长提闪烁
    关联事件,向窗体中添加控件,设置控件属性等系列操作
    picturebox中添加图片
    typeof gettype
    groupbox
    static用法
    运算符重载
    类修饰符
  • 原文地址:https://www.cnblogs.com/ACGame/p/9112899.html
Copyright © 2020-2023  润新知