#include "tcp_cgi.hpp" #include "localserver/local_server.hpp" #include "localserver/cmt_server.hpp" #include 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 send_data = LocalServer::HandleCgi_cmd(recvData); if (send(connfd, send_data.c_str(), send_data.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 *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"); // } // 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 { // printf("recv len = %d\n", n); // buff[n] = '\0'; // PackageHead pkg; // pkg.head[0] = 0xAA; // pkg.head[1] = 0x55; // pkg.head[2] = 0xAA; // int recv_data_len = 0; // char send_data[96100] = {0}; // LocalServer::HandleTcp_cmd(buff,send_data,pkg.cmd,recv_data_len); // printf("response len = %d\n", 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; // } // Search search; // int PKG_HEADER_LEN = sizeof(PackageHead); // printf("package_num = %d\n", package_num); // if (recv_data_len > PKG_ONCE_SIZE) { // for (int i = 0; i < package_num; ++i) { // if (package_num - 1 == i) { // 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); // } else { // 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); // } // } // } else { // pkg.len = recv_data_len; // 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); // printf("only one pkg, send data len:%d\n", recv_data_len + PKG_HEADER_LEN); // } // close(connfd); // } // } // close(listenfd); // if (send_all_data) // { // free(send_all_data); // send_all_data = NULL; // } return; } TcpCgi::~TcpCgi() {}