Boost.asio 网络通信之同步TCP通信

时间:2022-09-08 22:16:36

服务端

// tcpServer.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <boost/asio.hpp>
#include <boost/system/error_code.hpp>
#include <boost/asio/ip/address.hpp>
using namespace boost::asio;

int main()
{
    try 
    {
        typedef ip::tcp::acceptor acceptor_type;
        typedef ip::tcp::endpoint endpoint_type;
        typedef ip::tcp::socket socket_type;

        std::cout << "sercer start." << std::endl;
        
        io_service io;
        acceptor_type acceptor(io,
            endpoint_type(ip::tcp::v4(), 6688));
        std::cout << acceptor.local_endpoint().address() << std::endl;

        for (;;)
        {
            socket_type socket(io);
            acceptor.accept(socket);

            std::cout << "client:";
            std::cout << socket.remote_endpoint().address() << std::endl;
            std::cout << socket.local_endpoint().address() << std::endl;
            
            socket.send(buffer("hello client, i am server."));
        }
        
    }
    catch (std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }

    getchar();
    std::cout << "Hello World!\n"; 
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门提示: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
acceptor(io,
            endpoint_type(ip::tcp::v4(), 6688));

客户端
// tcpClient.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <vector>
#include <boost/asio.hpp>
#include <boost/system/error_code.hpp>
#include <boost/asio/ip/address.hpp>
using namespace boost::asio;

int main()
{
    try
    {
        typedef ip::tcp::endpoint endpoint_type;
        typedef ip::tcp::socket socket_type;
        typedef ip::address address_type;

        std::cout << "client start." << std::endl;

        io_service io;
        socket_type socket(io);
        endpoint_type ep(
            address_type::from_string("127.0.0.1"),
            6688);

        socket.connect(ep);

        Sleep(1000);  //测试时,一定要加,否则会乱码或者其它情况出现;不加,得到的接收长度是0
        
        std::cout << socket.available() << std::endl;
     //方式一
        //std::vector<char> str(socket.available() + 1, 0);
        ////通过容器接收
        //socket.receive(buffer(str));

        //std::cout << "receive form " << socket.remote_endpoint().address() << std::endl;
        //std::cout << &str[0];

        //通过字符串接收
        //char *p= new char [socket.available() + 1];
        //socket.receive(buffer(p, socket.available() + 1));

        //std::cout << "receive form " << socket.remote_endpoint().address() << std::endl;
        //std::cout << p << std::endl;

        //方式二
        std::vector<char> str(socket.available() + 1, 0);
        boost::system::error_code ec;
        for (;;)
        {
            socket.read_some(buffer(str), ec);
            if (ec)
            {
                break;
            }
            std::cout << &str[0];
        }

    }
    catch (const std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }

    getchar();
    std::cout << "Hello World!\n"; 
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门提示: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件