|
沙发
发表于 2025-3-19 22:42:34
|
只看该作者
山西省太原市
#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
// 获取本机 IP 地址的后两码
std::string getLocalIPLastTwoDigits() {
char hostname[256];
if (gethostname(hostname, sizeof(hostname)) == SOCKET_ERROR) {
std::cerr << "无法获取主机名" << std::endl;
return "";
}
struct hostent* host = gethostbyname(hostname);
if (host == nullptr) {
std::cerr << "无法获取主机信息" << std::endl;
return "";
}
// 获取第一个 IP 地址
std::string ip = inet_ntoa(*(struct in_addr*)*host->h_addr_list);
size_t lastDot = ip.find_last_of('.');
if (lastDot == std::string::npos) {
std::cerr << "IP 地址格式错误" << std::endl;
return "";
}
// 提取后两码
return ip.substr(lastDot + 1);
}
// 发送消息到 MCMQ
bool sendToMCMQ(const std::string& ip, int port, const std::string& sendQueue, const std::string& replyQueue, const std::string& message) {
// 初始化 Winsock
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0) {
std::cerr << "WSAStartup 失败" << std::endl;
return false;
}
// 创建套接字
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET) {
std::cerr << "套接字创建失败" << std::endl;
WSACleanup();
return false;
}
// 设置服务器地址
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);
serverAddr.sin_addr.s_addr = inet_addr(ip.c_str());
// 连接到服务器
if (connect(sock, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
std::cerr << "连接服务器失败" << std::endl;
closesocket(sock);
WSACleanup();
return false;
}
// 构造发送消息
std::string sendCommand = "SEND " + sendQueue + "\n" + message + "\n";
if (send(sock, sendCommand.c_str(), sendCommand.length(), 0)) == SOCKET_ERROR) {
std::cerr << "发送消息失败" << std::endl;
closesocket(sock);
WSACleanup();
return false;
}
std::cout << "消息已发送到队列: " << sendQueue << std::endl;
// 接收回复消息
char buffer[4096];
std::string replyCommand = "RECEIVE " + replyQueue + "\n";
if (send(sock, replyCommand.c_str(), replyCommand.length(), 0)) == SOCKET_ERROR) {
std::cerr << "发送接收命令失败" << std::endl;
closesocket(sock);
WSACleanup();
return false;
}
int bytesReceived = recv(sock, buffer, sizeof(buffer), 0);
if (bytesReceived > 0) {
std::string reply(buffer, bytesReceived);
std::cout << "收到回复: " << reply << std::endl;
} else {
std::cerr << "接收回复失败" << std::endl;
}
// 关闭套接字
closesocket(sock);
WSACleanup();
return true;
}
int main() {
// MCMQ 服务器信息
std::string mcmqIP = "192.168.83.232";
int mcmqPort = 7600;
std::string sendQueue = "BPAC.CHK";
// 获取本机 IP 后两码
std::string ipLastTwoDigits = getLocalIPLastTwoDigits();
if (ipLastTwoDigits.empty()) {
return 1;
}
std::string replyQueue = "TSR" + ipLastTwoDigits;
// 构造 XML 消息
std::string xmlMessage = R"(
<?xml version="1.0" encoding='UTF-8'?>
<trx>
<message_id>panel_verify_request</message_id>
<log_id>FQC10120240708163800</log_id>
<type_id>I</type_id>
<station>FQC_F10101</station>
<panel_id>F15910G08004149000M002BD2XTX1</panel_id>
</trx>
)";
// 发送消息到 MCMQ
if (sendToMCMQ(mcmqIP, mcmqPort, sendQueue, replyQueue, xmlMessage)) {
std::cout << "消息发送成功!" << std::endl;
} else {
std::cerr << "消息发送失败!" << std::endl;
}
return 0;
} |
|