2024-10-22 20:56:21 +08:00
|
|
|
#include "tcp_cgi.hpp"
|
2024-10-23 22:25:03 +08:00
|
|
|
#include "localserver/local_server.hpp"
|
2025-01-09 20:00:34 +08:00
|
|
|
#include "localserver/cmt_protocol.h"
|
2024-10-23 20:33:05 +08:00
|
|
|
#include <zlog.h>
|
2024-10-22 20:56:21 +08:00
|
|
|
|
2024-10-23 20:33:05 +08:00
|
|
|
extern zlog_category_t *zct;
|
|
|
|
|
extern zlog_category_t *zbt;
|
2024-10-22 19:04:25 +08:00
|
|
|
|
2024-10-23 20:33:05 +08:00
|
|
|
TcpCgi::TcpCgi() { zlog_info(zbt, "TcpCgi Init"); }
|
2024-10-22 19:04:25 +08:00
|
|
|
|
|
|
|
|
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) {
|
2024-10-23 20:33:05 +08:00
|
|
|
zlog_error(zbt, "create socket error: %s(errno: %d)", strerror(errno), errno);
|
2024-10-22 19:04:25 +08:00
|
|
|
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) {
|
2024-10-23 20:33:05 +08:00
|
|
|
zlog_error(zbt, "bind socket error: %s(errno: %d)", strerror(errno), errno);
|
2024-10-22 19:04:25 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (listen(listenfd, 10) == -1) {
|
2024-10-23 20:33:05 +08:00
|
|
|
zlog_error(zbt, "listen socket error: %s(errno: %d)", strerror(errno), errno);
|
2024-10-22 19:04:25 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (1) {
|
|
|
|
|
if ((connfd = accept(listenfd, (struct sockaddr *)NULL, NULL)) == -1) {
|
2024-10-23 20:33:05 +08:00
|
|
|
zlog_error(zct, "accept socket error: %s(errno: %d)", strerror(errno), errno);
|
2024-10-22 19:04:25 +08:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
n = recv(connfd, buff, 40960, 0);
|
|
|
|
|
if (n <= 0) {
|
2024-10-23 20:33:05 +08:00
|
|
|
zlog_info(zct, "recv 0 and will close");
|
2024-10-22 19:04:25 +08:00
|
|
|
close(connfd);
|
|
|
|
|
} else {
|
|
|
|
|
buff[n] = '\0';
|
|
|
|
|
|
|
|
|
|
std::string recvData = std::string(buff);
|
2025-01-13 20:11:40 +08:00
|
|
|
std::string send_data = LocalServer::HandleCgi_cmd(recvData);
|
|
|
|
|
if (send(connfd, send_data.c_str(), send_data.length(), 0) < 0) {
|
2024-10-23 20:33:05 +08:00
|
|
|
zlog_error(zct, "send msg error: %s(errno: %d)", strerror(errno), errno);
|
2024-10-22 19:04:25 +08:00
|
|
|
}
|
|
|
|
|
close(connfd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
close(listenfd);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-09 20:00:34 +08:00
|
|
|
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;
|
|
|
|
|
}
|
2025-01-13 20:11:40 +08:00
|
|
|
char *send_all_data = NULL;
|
|
|
|
|
send_all_data = (char*)malloc(384000); // 96000*4 = 384000
|
|
|
|
|
if (send_all_data == NULL) {
|
|
|
|
|
zlog_error(zct,"send_all_data Memory error");
|
2025-01-09 20:00:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 {
|
2025-01-13 20:11:40 +08:00
|
|
|
printf("recv len = %d\n", n);
|
2025-01-09 20:00:34 +08:00
|
|
|
buff[n] = '\0';
|
|
|
|
|
PackgeHead pkg;
|
|
|
|
|
pkg.head[0] = 0xAA;
|
|
|
|
|
pkg.head[1] = 0x55;
|
|
|
|
|
pkg.head[2] = 0xAA;
|
|
|
|
|
int recv_data_len = 0;
|
2025-01-13 20:11:40 +08:00
|
|
|
char send_data[96100] = {0};
|
|
|
|
|
LocalServer::HandleTcp_cmd(buff,send_data,pkg.cmd,recv_data_len);
|
|
|
|
|
printf("response len = %d\n", recv_data_len);
|
2025-01-09 20:00:34 +08:00
|
|
|
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;
|
|
|
|
|
}
|
2025-01-13 20:11:40 +08:00
|
|
|
Search search;
|
2025-01-09 20:00:34 +08:00
|
|
|
int PKG_HEADER_LEN = sizeof(PackgeHead);
|
2025-01-13 20:11:40 +08:00
|
|
|
printf("package_num = %d\n", package_num);
|
2025-01-09 20:00:34 +08:00
|
|
|
if (recv_data_len > PKG_ONCE_SIZE) {
|
|
|
|
|
for (int i = 0; i < package_num; ++i) {
|
|
|
|
|
if (package_num - 1 == i) {
|
2025-01-13 20:11:40 +08:00
|
|
|
memcpy(send_all_data , send_data + i * PKG_ONCE_SIZE, recv_data_len - i * PKG_ONCE_SIZE);
|
|
|
|
|
send(connfd, send_all_data, recv_data_len - i * PKG_ONCE_SIZE,0);
|
|
|
|
|
printf("i = %d,send size = %d\n",i,recv_data_len - i * PKG_ONCE_SIZE + PKG_HEADER_LEN);
|
|
|
|
|
}else if(i == 0){
|
|
|
|
|
printf("i = %d,head size = %d,total size = %d\n",i,PKG_HEADER_LEN, PKG_ONCE_SIZE + PKG_HEADER_LEN);
|
|
|
|
|
pkg.len = recv_data_len;
|
|
|
|
|
memcpy(send_all_data, &pkg, PKG_HEADER_LEN);
|
|
|
|
|
memcpy(send_all_data + PKG_HEADER_LEN, send_data + i * PKG_ONCE_SIZE, PKG_ONCE_SIZE);
|
|
|
|
|
send(connfd, send_all_data, PKG_ONCE_SIZE + PKG_HEADER_LEN,0);
|
|
|
|
|
printf("i = %d,send size = %d\n",i,PKG_ONCE_SIZE + PKG_HEADER_LEN);
|
|
|
|
|
memset(send_all_data,0,38400);
|
2025-01-09 20:00:34 +08:00
|
|
|
} else {
|
2025-01-13 20:11:40 +08:00
|
|
|
printf("i = %d,package_num = %d\n",i, package_num);
|
|
|
|
|
memcpy(send_all_data, send_data + i * PKG_ONCE_SIZE, PKG_ONCE_SIZE);
|
|
|
|
|
send(connfd, send_all_data, PKG_ONCE_SIZE,0);
|
|
|
|
|
printf("i = %d,send size = %d\n",i,PKG_ONCE_SIZE);
|
|
|
|
|
memset(send_all_data,0,38400);
|
|
|
|
|
mssleep(50);
|
2025-01-09 20:00:34 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
pkg.len = recv_data_len;
|
2025-01-13 20:11:40 +08:00
|
|
|
memcpy(send_all_data, &pkg, PKG_HEADER_LEN);
|
|
|
|
|
memcpy(send_all_data + PKG_HEADER_LEN, &send_data, recv_data_len);
|
|
|
|
|
send(connfd, send_all_data, recv_data_len + PKG_HEADER_LEN,0);
|
2025-01-09 20:00:34 +08:00
|
|
|
printf("only one pkg, send data len:%d\n", recv_data_len + PKG_HEADER_LEN);
|
2025-01-13 20:11:40 +08:00
|
|
|
|
2025-01-09 20:00:34 +08:00
|
|
|
}
|
2025-01-13 20:11:40 +08:00
|
|
|
|
2025-01-09 20:00:34 +08:00
|
|
|
|
|
|
|
|
close(connfd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
close(listenfd);
|
2025-01-13 20:11:40 +08:00
|
|
|
if (send_all_data)
|
2025-01-09 20:00:34 +08:00
|
|
|
{
|
2025-01-13 20:11:40 +08:00
|
|
|
free(send_all_data);
|
|
|
|
|
send_all_data = NULL;
|
2025-01-09 20:00:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-22 19:04:25 +08:00
|
|
|
TcpCgi::~TcpCgi() {}
|