1232 lines
24 KiB
C
1232 lines
24 KiB
C
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//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;
|
|||
|
|
}
|