{# 发送器模板 #} {% if part == 'header' %} #pragma once #include #include #include /** * 数据发送器 * 用于发送{{ target_message.full_name }}消息 */ class DataSender { public: DataSender(); ~DataSender(); // 初始化连接 bool initialize(const std::string& host, int port); // 发送数据 bool send(const std::vector& data); // 关闭连接 void close(); private: int socket_fd_; bool connected_; }; {% else %} #include "sender.h" #include #include #include #include #include DataSender::DataSender() : socket_fd_(-1), connected_(false) { } DataSender::~DataSender() { close(); } bool DataSender::initialize(const std::string& host, int port) { socket_fd_ = socket(AF_INET, SOCK_STREAM, 0); if (socket_fd_ < 0) { return false; } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); inet_pton(AF_INET, host.c_str(), &server_addr.sin_addr); if (connect(socket_fd_, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { ::close(socket_fd_); socket_fd_ = -1; return false; } connected_ = true; return true; } bool DataSender::send(const std::vector& data) { if (!connected_) { return false; } // 先发送数据长度 uint32_t data_length = data.size(); if (::send(socket_fd_, &data_length, sizeof(data_length), 0) != sizeof(data_length)) { return false; } // 发送数据 size_t total_sent = 0; while (total_sent < data.size()) { ssize_t n = ::send(socket_fd_, data.data() + total_sent, data.size() - total_sent, 0); if (n <= 0) { return false; } total_sent += n; } return true; } void DataSender::close() { if (socket_fd_ >= 0) { ::close(socket_fd_); socket_fd_ = -1; } connected_ = false; } {% endif %}