WLG/utility/tcp_cgi.cpp
2025-01-09 20:00:34 +08:00

165 lines
5.7 KiB
C++

#include "tcp_cgi.hpp"
#include "localserver/local_server.hpp"
#include "localserver/cmt_protocol.h"
#include <zlog.h>
extern zlog_category_t *zct;
extern zlog_category_t *zbt;
TcpCgi::TcpCgi() { zlog_info(zbt, "TcpCgi Init"); }
void TcpCgi::startCgiServer() {
int listenfd, connfd;
int mw_optval = 1;
struct sockaddr_in servaddr;
char buff[40960];
int n;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
zlog_error(zbt, "create socket error: %s(errno: %d)", strerror(errno), errno);
return;
}
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&mw_optval, sizeof(mw_optval));
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(7305);
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
zlog_error(zbt, "bind socket error: %s(errno: %d)", strerror(errno), errno);
return;
}
if (listen(listenfd, 10) == -1) {
zlog_error(zbt, "listen socket error: %s(errno: %d)", strerror(errno), errno);
return;
}
while (1) {
if ((connfd = accept(listenfd, (struct sockaddr *)NULL, NULL)) == -1) {
zlog_error(zct, "accept socket error: %s(errno: %d)", strerror(errno), errno);
continue;
}
n = recv(connfd, buff, 40960, 0);
if (n <= 0) {
zlog_info(zct, "recv 0 and will close");
close(connfd);
} else {
buff[n] = '\0';
std::string recvData = std::string(buff);
std::string reqData = LocalServer::HandleCgi_cmd(recvData);
if (send(connfd, reqData.c_str(), reqData.length(), 0) < 0) {
zlog_error(zct, "send msg error: %s(errno: %d)", strerror(errno), errno);
}
close(connfd);
}
}
close(listenfd);
return;
}
void TcpCgi::startTCPServer() {
int listenfd, connfd;
int mw_optval = 1;
struct sockaddr_in servaddr;
char buff[40960];
int n;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
zlog_error(zbt, "create socket error: %s(errno: %d)", strerror(errno), errno);
return;
}
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&mw_optval, sizeof(mw_optval));
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(10000);
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
zlog_error(zbt, "bind socket error: %s(errno: %d)", strerror(errno), errno);
return;
}
if (listen(listenfd, 10) == -1) {
zlog_error(zbt, "listen socket error: %s(errno: %d)", strerror(errno), errno);
return;
}
char *recv_data = NULL;
recv_data = (char*)malloc(384000); // 96000*4 = 384000
if (recv_data == NULL) {
zlog_error(zct,"recv_data Memory error");
}
while (1) {
if ((connfd = accept(listenfd, (struct sockaddr *)NULL, NULL)) == -1) {
zlog_error(zct, "accept socket error: %s(errno: %d)", strerror(errno), errno);
continue;
}
n = recv(connfd, buff, 40960, 0);
if (n <= 0) {
zlog_info(zct, "recv 0 and will close");
close(connfd);
} else {
buff[n] = '\0';
PackgeHead pkg;
pkg.head[0] = 0xAA;
pkg.head[1] = 0x55;
pkg.head[2] = 0xAA;
int recv_data_len = 0;
char *reqData = LocalServer::HandleTcp_cmd(buff,pkg.cmd,recv_data_len);
int PKG_ONCE_SIZE = 1300;
int package_num = recv_data_len / PKG_ONCE_SIZE + 1;
if (recv_data_len % PKG_ONCE_SIZE == 0) {
package_num -= 1;
}
pkg.total_pkg_count = package_num;
int PKG_HEADER_LEN = sizeof(PackgeHead);
printf("response len = %d\n", recv_data_len);
if (recv_data_len > PKG_ONCE_SIZE) {
for (int i = 0; i < package_num; ++i) {
pkg.current_pkg_id = i+1;
if (package_num - 1 == i) {
pkg.len = recv_data_len - i*PKG_ONCE_SIZE;
memcpy(recv_data, &pkg, PKG_HEADER_LEN);
memcpy(recv_data + PKG_HEADER_LEN, reqData + i*PKG_ONCE_SIZE, recv_data_len - i*PKG_ONCE_SIZE);
send(connfd, recv_data, recv_data_len - i*PKG_ONCE_SIZE + PKG_HEADER_LEN,0);
} else {
pkg.len = PKG_ONCE_SIZE;
memcpy(recv_data, &pkg, PKG_HEADER_LEN);
memcpy(recv_data + PKG_HEADER_LEN, reqData + i*PKG_ONCE_SIZE, PKG_ONCE_SIZE);
send(connfd, recv_data, PKG_ONCE_SIZE + PKG_HEADER_LEN,0);
mssleep(10); // ms
}
}
} else {
pkg.current_pkg_id = 1;
pkg.len = recv_data_len;
memcpy(recv_data, &pkg, PKG_HEADER_LEN);
memcpy(recv_data + PKG_HEADER_LEN, &reqData, recv_data_len);
send(connfd, recv_data, recv_data_len + PKG_HEADER_LEN,0);
printf("only one pkg, send data len:%d\n", recv_data_len + PKG_HEADER_LEN);
}
if (reqData)
{
free(reqData);
reqData = NULL;
}
close(connfd);
}
}
close(listenfd);
if (recv_data)
{
free(recv_data);
recv_data = NULL;
}
return;
}
TcpCgi::~TcpCgi() {}