wordpress企业站被黑,小程序开发需要的技术,怎么样管理网站,中国住房城乡建设部官方网站使用C11的std::future和std::promise实现异步网络通信
在现代C编程中#xff0c;异步编程是一个重要的主题。C11引入了std::future和std::promise#xff0c;为异步编程提供了强大的工具。本文将详细介绍如何使用std::future和std::promise实现异步网络通信#xff0c;并提…使用C11的std::future和std::promise实现异步网络通信
在现代C编程中异步编程是一个重要的主题。C11引入了std::future和std::promise为异步编程提供了强大的工具。本文将详细介绍如何使用std::future和std::promise实现异步网络通信并提供丰富的示例代码。
什么是std::future和std::promise
std::future和std::promise是C11标准库中的两个类用于实现异步操作
std::promise用于设置一个值或异常该值或异常可以在另一个线程中被获取。std::future用于获取由std::promise设置的值或异常。
通过std::promise和std::future我们可以在一个线程中启动一个异步操作并在另一个线程中等待其完成。
实现异步网络通信的步骤
创建Socket使用socket函数创建一个Socket。连接服务器使用connect函数连接到服务器。发送和接收消息使用send和recv函数进行消息传递。使用std::promise和std::future在异步操作中使用std::promise和std::future来实现异步通信。
示例代码
以下是实现一个简单的异步TCP客户端的完整代码示例
#include iostream
#include cstring
#include sys/types.h
#include sys/socket.h
#include netinet/in.h
#include arpa/inet.h
#include unistd.h
#include futureconst int PORT 8080;
const int BUFFER_SIZE 1024;std::string async_send_receive(const std::string server_ip, const std::string message) {// 创建Socketint client_socket socket(AF_INET, SOCK_STREAM, 0);if (client_socket -1) {throw std::runtime_error(Failed to create socket);}// 服务器地址sockaddr_in server_addr;std::memset(server_addr, 0, sizeof(server_addr));server_addr.sin_family AF_INET;server_addr.sin_port htons(PORT);inet_pton(AF_INET, server_ip.c_str(), server_addr.sin_addr);// 连接服务器if (connect(client_socket, (sockaddr*)server_addr, sizeof(server_addr)) -1) {close(client_socket);throw std::runtime_error(Failed to connect to server);}// 发送消息send(client_socket, message.c_str(), message.size(), 0);// 接收响应char buffer[BUFFER_SIZE];std::memset(buffer, 0, BUFFER_SIZE);int bytes_received recv(client_socket, buffer, BUFFER_SIZE, 0);if (bytes_received 0) {close(client_socket);throw std::runtime_error(Failed to receive response);}// 关闭连接close(client_socket);return std::string(buffer, bytes_received);
}int main() {std::string server_ip 127.0.0.1;std::string message Hello, Server!;// 创建promise和futurestd::promisestd::string promise;std::futurestd::string future promise.get_future();// 启动异步任务std::thread([promise, server_ip, message]() {try {std::string response async_send_receive(server_ip, message);promise.set_value(response);} catch (const std::exception e) {promise.set_exception(std::current_exception());}}).detach();// 等待并获取结果try {std::string response future.get();std::cout Received response: response std::endl;} catch (const std::exception e) {std::cerr Error: e.what() std::endl;}return 0;
}代码解析 创建Socket int client_socket socket(AF_INET, SOCK_STREAM, 0);
if (client_socket -1) {throw std::runtime_error(Failed to create socket);
}这行代码创建了一个TCP Socket。AF_INET表示使用IPv4地址SOCK_STREAM表示使用TCP协议。 连接服务器 sockaddr_in server_addr;
std::memset(server_addr, 0, sizeof(server_addr));
server_addr.sin_family AF_INET;
server_addr.sin_port htons(PORT);
inet_pton(AF_INET, server_ip.c_str(), server_addr.sin_addr);if (connect(client_socket, (sockaddr*)server_addr, sizeof(server_addr)) -1) {close(client_socket);throw std::runtime_error(Failed to connect to server);
}这段代码将客户端连接到指定的服务器地址和端口。 发送和接收消息 send(client_socket, message.c_str(), message.size(), 0);char buffer[BUFFER_SIZE];
std::memset(buffer, 0, BUFFER_SIZE);
int bytes_received recv(client_socket, buffer, BUFFER_SIZE, 0);
if (bytes_received 0) {close(client_socket);throw std::runtime_error(Failed to receive response);
}close(client_socket);return std::string(buffer, bytes_received);这段代码发送消息给服务器然后等待接收服务器的响应。接收到响应后关闭连接并返回响应内容。 使用std::promise和std::future std::promisestd::string promise;
std::futurestd::string future promise.get_future();std::thread([promise, server_ip, message]() {try {std::string response async_send_receive(server_ip, message);promise.set_value(response);} catch (const std::exception e) {promise.set_exception(std::current_exception());}
}).detach();try {std::string response future.get();std::cout Received response: response std::endl;
} catch (const std::exception e) {std::cerr Error: e.what() std::endl;
}这段代码创建了一个std::promise对象并通过get_future方法获取对应的std::future对象。然后启动一个新线程在新线程中执行异步任务并将结果设置到std::promise中。主线程等待std::future获取结果并处理异常。
进一步优化
虽然上述代码实现了一个基本的异步TCP客户端但在实际应用中我们可能需要进一步优化和扩展功能
错误处理添加更多的错误处理逻辑处理各种可能的网络错误。超时机制实现超时机制避免异步操作无限期等待。多线程处理使用线程池或异步I/O来提高并发性能。数据序列化使用数据序列化技术如JSON或Protobuf来传输复杂的数据结构。
超时机制示例
以下是一个实现超时机制的示例
#include iostream
#include cstring
#include sys/types.h
#include sys/socket.h
#include netinet/in.h
#include arpa/inet.h
#include unistd.h
#include future
#include chronoconst int PORT 8080;
const int BUFFER_SIZE 1024;std::string async_send_receive(const std::string server_ip, const std::string message) {// 创建Socketint client_socket socket(AF_INET, SOCK_STREAM, 0);if (client_socket -1) {throw std::runtime_error(Failed to create socket);}// 服务器地址sockaddr_in server_addr;std::memset(server_addr, 0, sizeof(server_addr));server_addr.sin_family AF_INET;server_addr.sin_port htons(PORT);inet_pton(AF_INET, server_ip.c_str(), server_addr.sin_addr);// 连接服务器if (connect(client_socket, (sockaddr*)server_addr, sizeof(server_addr)) -1) {close(client_socket);throw std::runtime_error(Failed to connect to server);}// 发送消息send(client_socket, message.c_str(), message.size(), 0);// 接收响应char buffer[BUFFER_SIZE];std::memset(buffer, 0, BUFFER_SIZE);int bytes_received recv(client_socket, buffer, BUFFER_SIZE, 0);if (bytes_received 0) {close(client_socket);throw std::runtime_error(Failed to receive response);}// 关闭连接close(client_socket);return std::string(buffer, bytes_received);
}int main() {std::string server_ip 127.好的我们继续。#### 超时机制示例续以下是一个实现超时机制的完整示例cpp
#include iostream
#include cstring
#include sys/types.h
#include sys/socket.h
#include netinet/in.h
#include arpa/inet.h
#include unistd.h
#include future
#include chronoconst int PORT 8080;
const int BUFFER_SIZE 1024;std::string async_send_receive(const std::string server_ip, const std::string message) {// 创建Socketint client_socket socket(AF_INET, SOCK_STREAM, 0);if (client_socket -1) {throw std::runtime_error(Failed to create socket);}// 服务器地址sockaddr_in server_addr;std::memset(server_addr, 0, sizeof(server_addr));server_addr.sin_family AF_INET;server_addr.sin_port htons(PORT);inet_pton(AF_INET, server_ip.c_str(), server_addr.sin_addr);// 连接服务器if (connect(client_socket, (sockaddr*)server_addr, sizeof(server_addr)) -1) {close(client_socket);throw std::runtime_error(Failed to connect to server);}// 发送消息send(client_socket, message.c_str(), message.size(), 0);// 接收响应char buffer[BUFFER_SIZE];std::memset(buffer, 0, BUFFER_SIZE);int bytes_received recv(client_socket, buffer, BUFFER_SIZE, 0);if (bytes_received 0) {close(client_socket);throw std::runtime_error(Failed to receive response);}// 关闭连接close(client_socket);return std::string(buffer, bytes_received);
}int main() {std::string server_ip 127.0.0.1;std::string message Hello, Server!;// 创建promise和futurestd::promisestd::string promise;std::futurestd::string future promise.get_future();// 启动异步任务std::thread([promise, server_ip, message]() {try {std::string response async_send_receive(server_ip, message);promise.set_value(response);} catch (const std::exception e) {promise.set_exception(std::current_exception());}}).detach();// 等待并获取结果设置超时时间为5秒if (future.wait_for(std::chrono::seconds(5)) std::future_status::ready) {try {std::string response future.get();std::cout Received response: response std::endl;} catch (const std::exception e) {std::cerr Error: e.what() std::endl;}} else {std::cerr Request timed out std::endl;}return 0;
}在这个示例中我们使用std::future::wait_for方法设置了一个超时时间为5秒。如果在5秒内没有收到响应程序将输出“Request timed out”。
总结
通过本文我们详细介绍了如何使用C11的std::future和std::promise实现异步网络通信。我们探讨了std::future和std::promise的基本概念、实现异步TCP客户端的具体步骤和代码并展示了如何实现超时机制。
理解和掌握这些技术可以帮助你在异步编程和网络编程领域取得更大的进步。希望这篇文章能帮助你更好地理解和应用std::future和std::promise。如果你有任何问题或需要进一步的帮助请随时联系我。Happy coding!