#include "TcpCgi.hpp" namespace{ LocalServer *cidwServer = LocalServer::instance(); } TcpCgi::TcpCgi() { print_light_green("TcpCgi Init\n"); } 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 ){ printf("create socket error: %s(errno: %d)\n",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){ printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); return; } if( listen(listenfd, 10) == -1){ printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); return; } while(1){ if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1) { printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } n = recv(connfd, buff, 40960, 0); if ( n <= 0) { print_info("recv fail\n"); close(connfd); } else { buff[n] = '\0'; std::string recvData = std::string(buff); std::string reqData = cidwServer->HandleCgi_cmd(recvData); //print_info("send cgi : %s\n length = %d\n", reqData.c_str(),reqData.length()); if( send(connfd, reqData.c_str(), reqData.length(), 0) < 0){ printf("send msg error: %s(errno: %d)\n", strerror(errno), errno); } close(connfd); } } close(listenfd); return; } TcpCgi::~TcpCgi() { }