SIT/templates/cpp/sender.template

103 lines
2.1 KiB
Plaintext
Raw Permalink Normal View History

2026-01-29 09:08:31 +00:00
{# 发送器模板 #}
{% if part == 'header' %}
#pragma once
#include <vector>
#include <cstdint>
#include <string>
/**
* 数据发送器
* 用于发送{{ target_message.full_name }}消息
*/
class DataSender {
public:
DataSender();
~DataSender();
// 初始化连接
bool initialize(const std::string& host, int port);
// 发送数据
bool send(const std::vector<uint8_t>& data);
// 关闭连接
void close();
private:
int socket_fd_;
bool connected_;
};
{% else %}
#include "sender.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>
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<uint8_t>& 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 %}