103 lines
2.1 KiB
Plaintext
103 lines
2.1 KiB
Plaintext
|
|
{# 发送器模板 #}
|
||
|
|
{% 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 %}
|