在Linux下,使用Boost Asio库可以轻松实现非阻塞的网络API调用。以下是一个简单的例子,展示了如何设置一个非阻塞的TCP socket:
#include <boost/asio.hpp>
#include <iostream>int main() {// 创建IO服务对象,它负责异步操作boost::asio::io_service io_service;// 创建一个非阻塞的socket对象boost::asio::ip::tcp::socket socket(io_service);boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 80);// 连接到远程端点,这里是本地的80端口,但不会阻塞boost::system::error_code ec;socket.open(endpoint.protocol(), ec);if (ec) {std::cout << "Error opening socket: " << ec.message() << std::endl;return -1;}socket.non_blocking(true); // 设置为非阻塞模式socket.connect(endpoint, ec);// 检查连接是否已经建立,如果socket是非阻塞的,connect可能会立即返回if (ec) {if (ec == boost::asio::error::would_block) {// 连接操作正在进行中,我们需要等待数据准备好读取或写入// 这里可以进行其他的非阻塞操作} else {std::cout << "Error connecting: " << ec.message() << std::endl;return -1;}}// 完成非阻塞socket的使用后,记得关闭它socket.close();return 0;
}
编译
g++ Fiber.cpp -I /usr/include/boost -L /usr/lib/x86_64-linux-gnu -lboost_thread -lpthread
在这个例子中,我们首先创建了一个io_service
对象,这是Asio库用来处理异步操作的核心组件。然后,我们创建了一个tcp::socket
对象并将其与一个端点(endpoint)相连。我们通过调用socket.open()
打开了socket,并通过socket.non_blocking(true)
将其设置为非阻塞模式。
当我们调用socket.connect()
时,如果socket是非阻塞的,那么这个调用可能会立即返回,并且我们需要检查error_code
来判断连接是否已经建立或者还在进行中。如果操作系统告诉我们操作将会阻塞(would_block
),这时候我们可以进行其他的非阻塞操作。
最后,在使用完socket后,我们通过调用socket.close()
来关闭它。这是一个非常基础的例子,展示了如何使用Boost Asio库来创建非阻塞的网络应用程序。
linux编译boost库并执行程序_linux boost-CSDN博客
g++ test-boost.cpp -o test -L /root/data/lib/linux -l:libboost_system.a -l:libboost_filesystem.a
如果-l:filename格式指定一个文件名,连接程序直接去找这个文件名了,不会再像使用-lname时将name扩展成lib<name>.a格式的文件名.
所以使用 -l:libpng.a这样的形式来指定连接库,就指定了静态连接png库。
当然如果库的位置不在gcc默认搜索路径中,要用-L参数另外指定搜索库的路径,否则连接程序不知道该从哪里找到filename。