赞
踩
折腾了一上午,看到这个结果的时候泪目了兄弟闷,讲真。我的asio客户端成功收到服务端发来的消息了。虽然这确实是极其智障又简单的入门哈哈
链接:https://pan.baidu.com/s/1T3aUf3yZbn0nTGi19_RqYA
提取码:1234
文件7zip压缩包,下载用7zip解压,就是一个asio文件夹,里面包含了asio所有头文件源码。独立版的asio是header-only,所以使用时只需包含头文件即可。把解压得到的asio文件夹放到项目目录里。
VS新建CMake工程或VSCode新建CMake工程都可以。编写CMakeLists.txt将下载解压的asio文件夹添加到头文件搜索目录里,用工程main函数将服务端和客户端的源码文件链接生成可执行文件即可。
CMakeLists.txt源码
# CMakeList.txt: CMakeProject1 的 CMake 项目,在此处包括源代码并定义 # 项目特定的逻辑。 # cmake_minimum_required (VERSION 3.8) project ("CMakeProject1") ## 威力很大 include_directories(/asio) # 将源代码添加到此项目的可执行文件。 add_executable (CMakeProject1 CMakeProject1.cpp CMakeProject1.h) if (CMAKE_VERSION VERSION_GREATER 3.12) set_property(TARGET CMakeProject1 PROPERTY CXX_STANDARD 20) endif()
asio简单的服务端和客户端的代码网上一搜一帕拉,也可参照以下代码编写。
服务端代码
try { asio::io_service io_service; tcp::acceptor acceptor(io_service, tcp::endpoint(asio::ip::address::from_string("127.0.0.1"), 2121)); for (;;) { tcp::socket socket(io_service); acceptor.accept(socket); asio::write(socket, asio::buffer(std::string("欢迎来到 Asio的世界! 我们一起愉快地探索下去吧!"))); } } catch (std::exception& e) { std::cerr << e.what() << std::endl; }
客户端代码
try { asio::io_service io_service; tcp::resolver resolver(io_service); tcp::resolver::query query("127.0.0.1", "2121"); tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); tcp::endpoint endpoint = *endpoint_iterator; std::cout << endpoint << "\n\n"; tcp::socket socket(io_service); asio::connect(socket, endpoint_iterator); for (;;) { array<char, 128> buf; buf.fill('\0'); size_t len = socket.read_some(asio::buffer(buf)); std::cout << buf.data() << std::endl; } } catch (std::exception& e) { std::cerr << e.what() << std::endl; }
CMakeProject1.cpp 完整源文件
// CMakeProject1.cpp: 定义应用程序的入口点。 // #include "CMakeProject1.h" using namespace std; #include "./asio/asio.hpp" using asio::ip::tcp; #include <ctime> #include <iostream> #include <string> #include <iostream> int main(int argc, char* argv[]) { #if 0 asio::io_context io; asio::steady_timer t(io, asio::chrono::seconds(5)); t.async_wait(&print); std::cout << "hh" << std::endl; io.run(); #endif std::string input; std::cin >> input; if (input.compare("server") == 0) { try { asio::io_service io_service; tcp::acceptor acceptor(io_service, tcp::endpoint(asio::ip::address::from_string("127.0.0.1"), 2121)); for (;;) { tcp::socket socket(io_service); acceptor.accept(socket); asio::write(socket, asio::buffer(std::string("欢迎来到 Asio的世界! 我们一起愉快地探索下去吧!"))); } } catch (std::exception& e) { std::cerr << e.what() << std::endl; } } else if(input.compare("client") == 0) { try { asio::io_service io_service; tcp::resolver resolver(io_service); tcp::resolver::query query("127.0.0.1", "2121"); tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); tcp::endpoint endpoint = *endpoint_iterator; std::cout << endpoint << "\n\n"; tcp::socket socket(io_service); asio::connect(socket, endpoint_iterator); for (;;) { array<char, 128> buf; buf.fill('\0'); size_t len = socket.read_some(asio::buffer(buf)); std::cout << buf.data() << std::endl; } } catch (std::exception& e) { std::cerr << e.what() << std::endl; } std::cout << "\n\n"; } return 0; }
VS的cmake项目小技巧
可以对项目右键点击选择右键菜单“在终端中打开”,打开终端,输入命令开启服务端或客户端。如果是开发网络通信小Demo,服务端和客户端放在一个工程中,通过终端输入命令参数,选择开启服务器或客户端比新建两个VS工程要简单方便些,铁汁闷。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。