1232 lines
24 KiB
C
Raw Normal View History

2020-01-13 10:27:00 -05:00
///////////////////////////////////////////////////////////////////////////////////
//multi_thread_server.c
///////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD>ļ<EFBFBD><C4BC>Ƕ<EFBFBD><C7B6>̲߳<DFB3><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
#include "common.h"
void myFree(void* ptr)
{
if(ptr != NULL)
{
free(ptr);
ptr = NULL;
}
}
void pritfExit()
{
int iExit = 0;
printf("Please enter any key to exit:");
scanf("%d", &iExit);
return;
}
int strTerm(char* str)
{
char* tmpstr = (char*) malloc(strlen(str) + 1);
char* tmpstart = NULL;
char* tmpend = NULL;
int len = 0;
strcpy(tmpstr, str);
tmpstart = tmpstr;
while((*tmpstart) == ' ')
{
tmpstart++;
}
tmpend = tmpstr + strlen(str) -1;
while((*tmpend) == ' ' || (*tmpend) == '\r' || (*tmpend) == '\n')
{
tmpend--;
}
if (tmpend >= tmpstart)
{
len = tmpend - tmpstart + 1;
strncpy(str, tmpstart, len);
str[len] = '\0';
}
else
{
strcpy(str, "\0");
}
tmpstart = NULL;
tmpend = NULL;
myFree(tmpstr);
return 0;
}
int SetServerPort()
{
FILE* fr = NULL;
char strPort[MAX_CMDLINE_LENGTH];
char *pPort = NULL;
memset(strPort, 0, MAX_CMDLINE_LENGTH);
// <20><>ȡcmdlist<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fr = fopen(CONFIG, "r");
if(fr == NULL)
{
printf(" Error: Open File of %s Failed!\n", CONFIG);
return -1;
}
if (fgets(strPort, MAX_CMDLINE_LENGTH, fr) != NULL)
{
pPort = strtok(strPort, ":");
pPort = strtok(NULL, ":");
if (pPort != NULL)
{
strcpy(strPort, pPort);
strTerm(strPort);
g_port = atoi(strPort);
printf(" Read Server Port : %d Sucess!\n", g_port);
}
else
{
printf(" Error: File %s is Invaild!", CONFIG);
printf(" Error: Read Server Port Failed!");
fclose(fr);
return -1;
}
}
fclose(fr);
return 0;
}
// ִ<><D6B4>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
int thr_fn(char* para)
{
int re;
#ifdef IN_LINUX
return system(para);
#else
PVOID OldValue = NULL;
Wow64DisableWow64FsRedirection(&OldValue);
re = system(para);
Wow64RevertWow64FsRedirection(OldValue);
return re;
#endif
}
#ifdef IN_LINUX
int SendDataToClient_linux(int socketID, char *data, int iLen)
{
char buffer[MAX_BUFFER_SIZE];
if (data == NULL)
{
printf("Error: Send Data is NULL!\n");
return -1;
}
bzero(buffer,MAX_BUFFER_SIZE);
memcpy(buffer, data, iLen);
//<2F><><EFBFBD>ͻ<EFBFBD><CDBB>˷<EFBFBD><CBB7><EFBFBD>buffer<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
if (send(socketID, buffer, iLen, 0) == -1)
{
printf("Error: Send Data Failed!\n");
return -1;
}
return 0;
}
int RecvDataFromClient_linux(int socketID, char *buffer, int iBufLen)
{
int length = 0;
if (buffer == NULL)
{
printf("Error: Buffer is NULL!\n");
return -1;
}
memset(buffer, 0, iBufLen);
//<2F><><EFBFBD>տͻ<D5BF><CDBB>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>buffer<65><72>
length = recv(socketID, buffer, iBufLen, 0);
if (length < 0 || length == 0)
{
printf("Client Exit!\n");
return 0;
}
return length;
}
void * TalkToClient_linux(void *data)
{
//void* <20><><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int new_server_socket = (int)data;
char buffer[MAX_CMDLINE_LENGTH];
char *pCmdType = NULL;
int iRet = 0;
//<2F><><EFBFBD>߳<EFBFBD>״̬<D7B4><CCAC>Ϊunjoinable<6C><65>ȷ<EFBFBD><C8B7><EFBFBD>߳<EFBFBD><DFB3>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>ͷ<EFBFBD>
pthread_detach(pthread_self());
memset(buffer, 0, MAX_CMDLINE_LENGTH);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կͻ<D4BF><CDBB>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
if (RecvDataFromClient_linux(new_server_socket, buffer, MAX_CMDLINE_LENGTH) > 0)
{
iRet = ParseCmd((void*)new_server_socket, buffer);
if (iRet == -1)
{
printf("Error: Parse Cmd Failed!\n");
}
}
close(new_server_socket);
pthread_exit(NULL);
}
int FindProcess_linux(char *pProcessName)
{
char szCmd[MAX_BUFFER_SIZE];
char *pProc = NULL;
FILE *fr = NULL;
memset(szCmd, 0, MAX_BUFFER_SIZE);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
strcpy(szCmd, "pidof ");
strcat(szCmd, pProcessName);
strcat(szCmd, " >tmp_process.txt");
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
thr_fn(szCmd);
fr = fopen("tmp_process.txt", "r");
if (fr == NULL)
{
printf("Error: Open file tmp_process.txt Failed!\n");
return -1;
}
memset(szCmd, 0, MAX_BUFFER_SIZE);
while (fgets(szCmd, MAX_BUFFER_SIZE, fr) != NULL)
{
if (strcmp("\n",szCmd) != 0)
{
fclose(fr);
return RET_OK;
}
}
fclose(fr);
return RET_FAILED;
}
int InitServer_linux()
{
int server_socket = -1;
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>socket<65><74>ַ<EFBFBD>ṹserver_addr,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>internet<65><74>ַ, <20>˿<EFBFBD>
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr)); //<2F><>һ<EFBFBD><D2BB><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(g_port);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>internet<65><74><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>(TCP)socket,<2C><>server_socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>socket
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1)
{
printf(" Error: Create Socket Failed!\n");
close(server_socket);
return -1;
}
printf(" Create Socket Success!\n");
//<2F><>socket<65><74>socket<65><74>ַ<EFBFBD><EFBFBD><E1B9B9>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>
if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
{
printf(" Error: Server Bind Port : %d Failed!\n", g_port);
close(server_socket);
return -1;
}
printf(" Server Bind Port : %d Success!\n", g_port);
//server_socket<65><74><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>
if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )
{
printf(" Error: Server Listen Failed!\n");
close(server_socket);
return -1;
}
return server_socket;
}
int StartService_linux(int server_socket)
{
int new_server_socket;
int err = 0;
pthread_t child_thread;
pthread_attr_t child_thread_attr;
pthread_attr_init(&child_thread_attr);
pthread_attr_setdetachstate(&child_thread_attr,PTHREAD_CREATE_DETACHED);
if (server_socket == -1)
{
printf(" Error: Server socket ID invalid!\n");
return -1;
}
while(1) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫһֱ<D2BB><D6B1><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB>˵<EFBFBD>socket<65><74>ַ<EFBFBD>ṹclient_addr
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>server_socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>socket<65><74>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>͵ȴ<CDB5><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--<2D><><EFBFBD><EFBFBD>accept<70><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//accept<70><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>µ<EFBFBD>socket,<2C><><EFBFBD><EFBFBD>socket(new_server_socket)<29><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ӵ<EFBFBD><D3B5>Ŀͻ<C4BF><CDBB><EFBFBD>ͨ<EFBFBD><CDA8>
//new_server_socket<65><74><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϳͻ<CDBF><CDBB><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ͨ<EFBFBD><CDA8>ͨ<EFBFBD><CDA8>
//accept<70><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5>Ŀͻ<C4BF><CDBB><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>д<EFBFBD><D0B4><EFBFBD>ͻ<EFBFBD><CDBB>˵<EFBFBD>socket<65><74>ַ<EFBFBD>ṹclient_addr<64><72>
new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr, &length);
if (new_server_socket == -1)
{
printf("Error: Server Accept Failed!\n");
return -1;
}
printf("\nServer accept a new connect!\n");
err = 0;
if( (err = pthread_create(&child_thread, &child_thread_attr, TalkToClient_linux, (void*)new_server_socket)) != 0 )
{
printf("Error: pthread_create Failed : %s\n",strerror(errno));
return -1;
}
}
}
#else
ULONG __stdcall TalkToClient_windows(void* lpParameter)
{
SOCKET new_server_socket = ((SOCKET)lpParameter);
char buffer[MAX_CMDLINE_LENGTH];
char *pCmd = NULL;
int iRet = 0;
memset(buffer, 0, MAX_CMDLINE_LENGTH);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կͻ<D4BF><CDBB>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
if (RecvDataFromClient_windows(new_server_socket, buffer, MAX_CMDLINE_LENGTH) > 0)
{
printf("Recv Data From Client: %s\n", buffer);
iRet = ParseCmd((void*)new_server_socket, buffer);
if (iRet == -1)
{
printf("Error: Parse Cmd Failed!\n");
closesocket(new_server_socket);
return -1;
}
}
closesocket(new_server_socket);
return 0;
}
int SendDataToClient_windows(SOCKET socketID, char *data, int iDataLen)
{
int iRet = 0;
char szBuffer[MAX_BUFFER_SIZE];
if (data == NULL)
{
printf("Error: Send Data is NULL!\n");
return -1;
}
memset(szBuffer, 0, MAX_BUFFER_SIZE);
memcpy(szBuffer, data, iDataLen);
//<2F><><EFBFBD>ͻ<EFBFBD><CDBB>˷<EFBFBD><CBB7><EFBFBD>buffer<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
iRet = send(socketID, szBuffer, iDataLen, 0);
if (iRet == SOCKET_ERROR)
{
printf("Error: Send error: %d!\n", GetLastError());
return -1;
}
return 0;
}
int RecvDataFromClient_windows(SOCKET socketID, char *buffer, int iBufLen)
{
int length = 0;
if (buffer == NULL)
{
printf("Error: Malloc Failed!\n");
return -1;
}
memset(buffer, 0, iBufLen);
//<2F><><EFBFBD>տͻ<D5BF><CDBB>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>buffer<65><72>
length = recv(socketID, buffer, iBufLen, 0);
if (length == 0 || length == SOCKET_ERROR)
{
printf("Client Exit!\n");
return 0;
}
return length;
}
int InitServer_windows(SOCKET *pServer_socket)
{
WSADATA Ws;
SOCKET server_socket;
int iRet = 0;
struct sockaddr_in server_addr;
*pServer_socket = INVALID_SOCKET;
//<2F><>ʼ<EFBFBD><CABC>windows socket
if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
{
printf(" Error: Init Windows Socket Failed: %d \n", GetLastError());
return -1;
}
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>socket<65><74>ַ<EFBFBD>ṹserver_addr,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>internet<65><74>ַ, <20>˿<EFBFBD>
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(g_port);
memset(server_addr.sin_zero, 0x00, 8);
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == INVALID_SOCKET)
{
printf(" Error: Create Socket Failed: %d\n", GetLastError());
closesocket(server_socket);
return -1;
}
printf(" Create Socket Success!\n");
//<2F><>socket<65><74>socket<65><74>ַ<EFBFBD><EFBFBD><E1B9B9>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>
iRet = bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr));
if( iRet != 0)
{
printf(" Error: Server Bind Port : %d Failed!\n", g_port);
closesocket(server_socket);
return -1;
}
printf(" Server Bind Port : %d Success!\n", g_port);
//server_socket<65><74><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>
iRet = listen(server_socket, LENGTH_OF_LISTEN_QUEUE);
if (iRet != 0)
{
printf(" Error: Server Listen Failed!\n");
closesocket(server_socket);
return -1;
}
*pServer_socket = server_socket;
return 0;
}
int StartService_windows(SOCKET server_socket)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB>˵<EFBFBD>socket<65><74>ַ<EFBFBD>ṹclient_addr
struct sockaddr_in client_addr;
int length = sizeof(client_addr);
SOCKET new_server_socket;
HANDLE hThread = 0;
if (server_socket == INVALID_SOCKET)
{
printf("Error: Server socket ID invalid!\n");
return -1;
}
while(1) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫһֱ<D2BB><D6B1><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>server_socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>socket<65><74>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>͵ȴ<CDB5><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--<2D><><EFBFBD><EFBFBD>accept<70><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//accept<70><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>µ<EFBFBD>socket,<2C><><EFBFBD><EFBFBD>socket(new_server_socket)<29><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ӵ<EFBFBD><D3B5>Ŀͻ<C4BF><CDBB><EFBFBD>ͨ<EFBFBD><CDA8>
//new_server_socket<65><74><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϳͻ<CDBF><CDBB><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ͨ<EFBFBD><CDA8>ͨ<EFBFBD><CDA8>
//accept<70><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5>Ŀͻ<C4BF><CDBB><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>д<EFBFBD><D0B4><EFBFBD>ͻ<EFBFBD><CDBB>˵<EFBFBD>socket<65><74>ַ<EFBFBD>ṹclient_addr<64><72>
new_server_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);
if (new_server_socket == INVALID_SOCKET)
{
printf("Error: Server Accept Failed!\n");
return -1;
}
printf("\nServer accept a new connect: %s\n", inet_ntoa(client_addr.sin_addr));
hThread = CreateThread(NULL, 0, TalkToClient_windows, (void*)new_server_socket, 0, NULL);
if( hThread == 0)
{
printf("Error: CreateThread Failed\n");
return -1;
}
CloseHandle(hThread);
}
}
#endif
int CopyFileToClient(void* socketID, char *pFile)
{
FILE *fr = NULL;
int iRet = 0;
int iLen = 0;
int iTotal = 0;
char strBuffer[MAX_BUFFER_SIZE];
#ifdef IN_LINUX
int socket;
#else
SOCKET socket;
#endif
#ifdef IN_LINUX
socket = (int)socketID;
if (socket == -1)
{
printf("Error: Socket ID Error!\n");
return -1;
}
#else
socket = (SOCKET)socketID;
if (socket == INVALID_SOCKET)
{
printf("Error: Socket ID Error!\n");
return -1;
}
#endif
if (pFile == NULL)
{
printf("Error: File Name is NULL!\n");
return -1;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
fr = fopen(pFile, "rb");
if(fr == NULL)
{
printf("Error: Open File : %s Failed!\n", pFile);
return -1;
}
memset(strBuffer, 0, MAX_BUFFER_SIZE);
//<2F><>ʼ<EFBFBD><CABC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while ((iLen = fread(strBuffer, sizeof(char), MAX_BUFFER_SIZE-1, fr)) > 0)
{
#ifdef IN_LINUX
iRet = SendDataToClient_linux(socket, strBuffer, iLen);
#else
iRet = SendDataToClient_windows(socket, strBuffer, iLen);
#endif
iTotal += iLen;
if (iRet == -1)
{
printf("Error: Send Data To Client Failed!\n");
fclose(fr);
return -1;
}
memset(strBuffer, 0, MAX_BUFFER_SIZE);
iRet = WaitRspFromClient(socketID);
if (iRet != RET_OK)
{
printf("Error: Wait Rsp From Client Failed!\n");
fclose(fr);
return -1;
}
}
printf("Copy File Total length: %d\n", iTotal);
fclose(fr);
return 0;
}
int RunSystemCmd(void* socketID, char *pCmd, int iWaitFlag)
{
char buf[BUFSIZE];
char cmd[MAX_CMDLINE_LENGTH];
#ifdef IN_LINUX
int filename;
#else
FILE *filename;
#endif
int iRet = 0;
char strCmd[MAX_CMDLINE_LENGTH];
#ifdef IN_LINUX
int socket;
#else
SOCKET socket;
#endif
#ifdef IN_LINUX
socket = (int)socketID;
if (socket == -1)
{
printf("Error: Socket ID Error!\n");
return -1;
}
#else
socket = (SOCKET)socketID;
if (socket == INVALID_SOCKET)
{
printf("Error: Socket ID Error!\n");
return -1;
}
#endif
if (pCmd == NULL)
{
printf("Error: Cmd is NULL!\n");
return -1;
}
memset(strCmd, 0, MAX_CMDLINE_LENGTH);
strncpy(strCmd, pCmd, MAX_CMDLINE_LENGTH);
if (iWaitFlag == CMD_ECHO)
{
memset(cmd,0,sizeof(cmd));
strcat(cmd,strCmd);
strcat(cmd," 1>fileecho 2>&1");
iRet = system(cmd);
#ifdef IN_LINUX
filename = open("fileecho",O_RDONLY );
#else
filename = fopen("fileecho","r");
#endif
if (filename == NULL)
{
iRet = -1;
return 0;
}
#ifdef IN_LINUX
if (read(filename, buf, BUFSIZE) == NULL)
#else
if (fread(buf, 1, BUFSIZE, filename) == NULL)
#endif
{
iRet = -1;
return 0;
}
#ifdef IN_LINUX
system("rm fileecho");
#endif
printf("%s\n", buf);
printf("%d\n", strlen(buf));
send(socketID, buf, BUFSIZE, 0);
if (iRet == 0)
{
iRet == CMD_ECHO;
}
}
else
{
//ִ<><D6B4>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
iRet = thr_fn(strCmd);
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>Ӧ<EFBFBD><D3A6>
if (iWaitFlag == CMD_FALG_WAIT)
{
if (iRet == 0)
{
printf("Run %s Success!\n", pCmd);
iRet = SendRspToClient(socketID, RSP_OK);
}
else
{
iRet = SendRspToClient(socketID, RSP_FAILED);
}
//<2F><><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>
if ( iRet == -1)
{
printf("Error: Send Rsp To Client Failed!\n");
}
printf("Send Rsp To Client Success!\n");
}
}
return 0;
}
int RecvFileFromClient(void* socketID, char *pFile)
{
char strBuffer[MAX_BUFFER_SIZE];
FILE *fr = NULL;
int iRet = 0;
int iTotal = 0;
#ifdef IN_LINUX
int socket;
#else
SOCKET socket;
#endif
#ifdef IN_LINUX
socket = (int)socketID;
if (socket == -1)
{
printf("Error: Socket ID Error!\n");
return -1;
}
#else
socket = (SOCKET)socketID;
if (socket == INVALID_SOCKET)
{
printf("Error: Socket ID Error!\n");
return -1;
}
#endif
if (pFile == NULL)
{
printf("Error: FileName is NULL!\n");
return -1;
}
memset(strBuffer, 0, MAX_BUFFER_SIZE);
//<2F><><EFBFBD><EFBFBD>׼<EFBFBD><D7BC>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD>
fr = fopen(pFile, "wb");
if(fr == NULL)
{
printf("Error: Open File :%s Failed!\n", pFile);
//<2F><><EFBFBD>߿ͻ<DFBF><CDBB>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
if (SendRspToClient(socketID, RSP_FAILED) == -1)
{
printf("Error: Send Rsp To Client Failed!\n");
}
return -1;
}
//<2F><><EFBFBD>߿ͻ<DFBF><CDBB>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
if (SendRspToClient(socketID, RSP_OK) == -1)
{
printf("Error: Send Rsp To Client Failed!\n");
}
printf("Send Rsp To Client Success!\n");
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կͻ<D4BF><CDBB>˵<EFBFBD><CBB5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
#ifdef IN_LINUX
iRet = RecvDataFromClient_linux(socket, strBuffer, MAX_BUFFER_SIZE);
#else
iRet = RecvDataFromClient_windows(socket, strBuffer, MAX_BUFFER_SIZE);
#endif
while ( iRet > 0)
{
iTotal += iRet;
//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>
if (SendRspToClient(socketID, RSP_OK) == -1)
{
printf("Error: Send Rsp To Client Failed!\n");
fclose(fr);
return -1;
}
if (fwrite(strBuffer, sizeof(char), iRet, fr) != iRet)
{
printf("Error: Write File Failed : %s\n", pFile);
fclose(fr);
return -1;
}
memset(strBuffer, 0, MAX_BUFFER_SIZE);
#ifdef IN_LINUX
iRet = RecvDataFromClient_linux(socket, strBuffer, MAX_BUFFER_SIZE);
#else
iRet = RecvDataFromClient_windows(socket, strBuffer, MAX_BUFFER_SIZE);
#endif
}
printf("Send File Length: %d\n", iTotal);
fclose(fr);
return 0;
}
int ParseCmd(void* socketID, char *data)
{
char *pCmdType = NULL;
char strCmd[MAX_CMDLINE_LENGTH];
char *pPara = NULL;
int iRet = 0;
memset(strCmd, 0, MAX_CMDLINE_LENGTH);
strncpy(strCmd, data, MAX_CMDLINE_LENGTH);
printf("Recv CMD: %s\n", strCmd);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pCmdType = strtok(strCmd, "[");
if (pCmdType == NULL)
{
printf("Error: Cmdlist para %s error!\n", strCmd);
return -1;
}
strTerm(pCmdType);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pPara = strtok(NULL, "]");
if (pPara == NULL)
{
printf("Error: Cmdlist para %s error!\n", strCmd);
return -1;
}
strTerm(pPara);
//Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
if (strcmp(COPYFILE, pCmdType) == 0)
{
if (CopyFileToClient(socketID, pPara) == -1)
{
printf("Error: Copy File To Client Failed!\n");
return -1;
}
printf("Copy File To Client Success!\n");
}
//Ϊ<>ͻ<EFBFBD><CDBB>˷<EFBFBD><CBB7><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
else if (strcmp(SENDFILE, pCmdType) == 0)
{
if (RecvFileFromClient(socketID, pPara) == -1)
{
printf("Error: Receive File From Client Failed!\n");
return -1;
}
printf("Receive File From Client Success!\n");
}
else if(strcmp(CMDECHO,pCmdType) == 0)
{
if (RunSystemCmd(socketID, pPara, CMD_ECHO) == -1)
{
return -1;
}
}
//Ϊϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
else if(strcmp(CMD, pCmdType) == 0)
{
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (RunSystemCmd(socketID, pPara, CMD_FALG_NOWAIT) == -1)
{
return -1;
}
}
//Ϊϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>,<2C><><EFBFBD>ȴ<EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><D9B8>ͻ<EFBFBD><CDBB><EFBFBD>Ӧ<EFBFBD><D3A6>
else if(strcmp(CMDWAIT, pCmdType) == 0)
{
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (RunSystemCmd(socketID, pPara, CMD_FALG_WAIT) == -1)
{
return -1;
}
}
//Ϊ<>鿴ij<E9BFB4><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
else if(strcmp(FINDPROC, pCmdType) == 0)
{
if (FindProcess(socketID, pPara) == -1)
{
printf("Error: Find Process Failed!\n");
return -1;
}
}
else
{
printf("Error: No Support : %s\n", pCmdType);
return -1;
}
return 0;
}
int FindProcess_windows(char *pProcessName)
{
char szCmd[MAX_BUFFER_SIZE];
char *pProc = NULL;
FILE *fr = NULL;
memset(szCmd, 0, MAX_BUFFER_SIZE);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
strcpy(szCmd, "tasklist /FI \"IMAGENAME eq ");
strcat(szCmd, pProcessName);
strcat(szCmd, "\" /NH>tmp_process.txt");
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
thr_fn(szCmd);
fr = fopen("tmp_process.txt", "r");
if (fr == NULL)
{
printf("Error: Open file tmp_process.txt Failed!\n");
return -1;
}
memset(szCmd, 0, MAX_BUFFER_SIZE);
while (fgets(szCmd, MAX_BUFFER_SIZE, fr) != NULL)
{
if (strlen(szCmd) > 0)
{
pProc = strtok(szCmd, " ");
strTerm(pProc);
//<2F>ҵ<EFBFBD><D2B5><EFBFBD>
if (strcmp(pProcessName, pProc) == 0)
{
fclose(fr);
return RET_OK;
}
}
memset(szCmd, 0, MAX_BUFFER_SIZE);
}
fclose(fr);
return RET_FAILED;
}
int FindProcess(void* socketID, char *data)
{
int iRet = 0;
#ifdef IN_LINUX
iRet = FindProcess_linux(data);
#else
iRet = FindProcess_windows(data);
#endif
if (iRet == -1)
{
return -1;
}
if (iRet == RET_OK)
{
iRet = SendRspToClient(socketID, RSP_OK);
}
else
{
iRet = SendRspToClient(socketID, RSP_FAILED);
}
if (iRet == -1)
{
printf("Error: Send Rsp To Client Failed!\n");
return -1;
}
printf("Send Rsp To Client Success!\n");
return 0;
}
int SendRspToClient(void* socketID, char *result)
{
int iRet = 0;
char strRsp[MAX_RSP_LENGTH];
#ifdef IN_LINUX
int socket;
#else
SOCKET socket;
#endif
#ifdef IN_LINUX
socket = (int)socketID;
if (socket == -1)
{
printf("Error: Socket ID Error!\n");
return -1;
}
#else
socket = (SOCKET)socketID;
if (socket == INVALID_SOCKET)
{
printf("Error: Socket ID Error!\n");
return -1;
}
#endif
if (result == NULL)
{
printf("Error: Send data is NULL!\n");
return -1;
}
memset(strRsp, 0, MAX_RSP_LENGTH);
//<2F><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>Ϣ
strcpy(strRsp, RSP);
strcat(strRsp, "#");
strcat(strRsp, result);
#ifdef IN_LINUX
iRet = SendDataToClient_linux(socket, strRsp, strlen(strRsp));
#else
iRet = SendDataToClient_windows(socket, strRsp, strlen(strRsp));
#endif
if (iRet == -1)
{
printf("Error: Send Data To Client Failed!\n");
return -1;
}
return 0;
}
int WaitRspFromClient(void* socketID)
{
char strRsp[MAX_RSP_LENGTH];
int iRet;
#ifdef IN_LINUX
int socket;
#else
SOCKET socket;
#endif
#ifdef IN_LINUX
socket = (int)socketID;
if (socket == -1)
{
printf("Error: Socket ID Error!\n");
return -1;
}
#else
socket = (SOCKET)socketID;
if (socket == INVALID_SOCKET)
{
printf("Error: Socket ID Error!\n");
return -1;
}
#endif
memset(strRsp, 0, MAX_RSP_LENGTH);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կͻ<D4BF><CDBB>˵<EFBFBD>Ӧ<EFBFBD><D3A6>
#ifdef IN_LINUX
iRet = RecvDataFromClient_linux(socket, strRsp, MAX_RSP_LENGTH);
#else
iRet = RecvDataFromClient_windows(socket, strRsp, MAX_RSP_LENGTH);
#endif
if (iRet <= 0)
{
return -1;
}
iRet = ParseRsp(strRsp);
return iRet;
}
int ParseRsp(char* pRsp)
{
char *pPara = NULL;
char strRsp[MAX_RSP_LENGTH];
memset(strRsp, 0, MAX_RSP_LENGTH);
if (strRsp == NULL)
{
printf("Error: strRsp is NULL!\n");
return -1;
}
strncpy(strRsp, pRsp, MAX_RSP_LENGTH);
pPara = strtok(strRsp, "#");
if (pRsp == NULL)
{
printf("Error: Rsp %s error!\n", pRsp);
return -1;
}
pPara = strtok(NULL, "#");
if (pRsp == NULL)
{
printf("Error: Rsp %s error!\n", pRsp);
return -1;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ϢΪOK
if (strcmp(pPara, RSP_OK) == 0)
{
return RET_OK;
}
else if (strcmp(pPara, RSP_FAILED) == 0)
{
return RET_FAILED;
}
return -1;
}
int Init()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>л<EFBFBD>ȡ<EFBFBD>˿<EFBFBD>
if (SetServerPort() == -1)
{
return -1;
}
return 0;
}
int Run()
{
#ifdef IN_LINUX
int server_socket = -1;
int iRet = 0;
//<2F><>ʼ<EFBFBD><CABC>socket
server_socket = InitServer_linux();
if (server_socket == -1)
{
printf(" Error: InitServer Failed! Exit...\n");
return -1;
}
printf(" InitServer Success!\n");
printf(" Server is running...\n\n");
printf("**************************************\n");
iRet = StartService_linux(server_socket);
if (iRet == -1)
{
printf(" Error: StartService Failed! Exit...\n");
close(server_socket);
return -1;
}
//<2F>رռ<D8B1><D5BC><EFBFBD><EFBFBD>õ<EFBFBD>socket
close(server_socket);
#else
SOCKET server_socket;
int iRet = 0;
//<2F><>ʼ<EFBFBD><CABC>socket
iRet = InitServer_windows(&server_socket);
if (iRet == -1)
{
printf(" Error: InitServer Failed! Exit...\n");
return -1;
}
printf(" InitServer Success!\n");
printf(" Server is running...\n");
printf("**************************************\n");
iRet = StartService_windows(server_socket);
if (iRet == -1)
{
printf("Error: StartService Failed! Exit...\n");
closesocket(server_socket);
WSACleanup();
return -1;
}
//<2F>رռ<D8B1><D5BC><EFBFBD><EFBFBD>õ<EFBFBD>socket
closesocket(server_socket);
WSACleanup();
#endif
return 0;
}
int main(int argc, char **argv)
{
int iRet = 0;
printf("======================================\n");
printf(" server-tool\n");
printf(" Version: %s\n", VERSION);
printf("======================================\n");
//<2F><>ʼ<EFBFBD><CABC>
iRet = Init();
if (iRet == -1)
{
printf(" Error: Init Failed! Server Exiting...\n");
#ifndef IN_LINUX
pritfExit();
#endif
return -1;
}
iRet = Run();
return 0;
}