1300 lines
25 KiB
C
Raw Normal View History

2020-01-13 10:27:00 -05:00
///////////////////////////////////////////////////////////////////////////////////
// multi_thread_client.c
///////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD>ļ<EFBFBD><C4BC>ǿͻ<C7BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶߳<DFB3><CCB6><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>񽻻<EFBFBD><F1BDBBBB>Ĵ<EFBFBD><C4B4><EFBFBD>
#include "common.h"
void myFree(void* ptr)
{
if(ptr != NULL)
{
free(ptr);
ptr = NULL;
}
}
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;
}
void pritfExit()
{
int iExit = 0;
printf("Please enter any key to exit:");
scanf("%d", iExit);
return;
}
#ifdef IN_LINUX
long send_all(int fd, char *message, int len)
{
int sended = 0;
int this_time = len;
char *p = message;
while (sended < len)
{
this_time = send(fd, p + sended, this_time, 0);
if (this_time < 0)
if (errno == EINTR)
{
continue;
}
else
{
printf("send error.(%s)", strerror(errno));
return -1;
}
sended += this_time;
}
return sended;
}
int SendDataToServer_linux(int socketID, char *data, int iLen)
{
int iRet = 0;
if (data == NULL)
{
printf("Error: Send Data is NULL!\n");
return -1;
}
char buffer[MAX_BUFFER_SIZE];
bzero(buffer,MAX_BUFFER_SIZE);
memcpy(buffer, data, iLen);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><CBB7><EFBFBD>buffer<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
if ((iRet = send_all(socketID, buffer, iLen)) != iLen)
{
printf("Error: Send Data Failed!\n");
return -1;
}
return 0;
}
int RecvDataFromServer_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>շ<EFBFBD><D5B7><EFBFBD><EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>buffer<65><72>
length = recv(socketID, buffer, iBufLen, 0);
if (length < 0)
{
printf("Error: Client Recieve Data Failed!\n");
return -1;
}
else if (length == 0)
{
printf("Server Exit!\n");
return 0;
}
return length;
}
int ConnectServer_linux(const char* pServerIP, int iServerPort, int iTimeout)
{
int iReConnectTimes = 0;
if (pServerIP == NULL)
{
printf("Error: ServerIP is NULL!\n");
return -1;
}
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>socket<65><74>ַ<EFBFBD>ṹclient_addr,<2C><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>internet<65><74>ַ, <20>˿<EFBFBD>
struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr)); //<2F><>һ<EFBFBD><D2BB><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0
client_addr.sin_family = AF_INET; //internetЭ<74><D0AD><EFBFBD><EFBFBD>
client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY<4E><59>ʾ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
client_addr.sin_port = htons(0); //0<><30>ʾ<EFBFBD><CABE>ϵͳ<CFB5>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ж˿<D0B6>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>internet<65><74><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>(TCP)socket,<2C><>client_socket<65><74><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>socket
int client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket == -1)
{
printf("Error: Create Socket Failed!\n");
close(client_socket);
return -1;
}
//<2F>ѿͻ<D1BF><CDBB><EFBFBD><EFBFBD><EFBFBD>socket<65>Ϳͻ<CDBF><CDBB><EFBFBD><EFBFBD><EFBFBD>socket<65><74>ַ<EFBFBD><EFBFBD><E1B9B9>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>
if( bind(client_socket, (struct sockaddr*)&client_addr, sizeof(client_addr)))
{
printf("Error: Client Bind Port Failed!\n");
close(client_socket);
return -1;
}
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>socket<65><74>ַ<EFBFBD>ṹserver_addr,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>internet<65><74>ַ, <20>˿<EFBFBD>
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
//inet_aton<6F><6E><EFBFBD><EFBFBD>inet_addr<64><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>IP<49>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
if (inet_aton(pServerIP, &server_addr.sin_addr) == 0) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<49><50>ַ<EFBFBD><D6B7><EFBFBD>Գ<EFBFBD><D4B3><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
{
printf("Error: Server IP Address Error!\n");
return -1;
}
server_addr.sin_port = htons(iServerPort);
socklen_t server_addr_length = sizeof(server_addr);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ӳɹ<D3B3><C9B9><EFBFBD>client_socket<65><74><EFBFBD><EFBFBD><EFBFBD>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>socket<65><74><EFBFBD><EFBFBD>
//֧<><D6A7>ʧ<EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD>
while (connect(client_socket, (struct sockaddr*)&server_addr, server_addr_length) < 0)
{
iReConnectTimes ++;
if (iReConnectTimes > iTimeout)
{
printf("Error: Has Reconnect %d Times! Connect To %s:%d Failed!\n", iReConnectTimes, pServerIP, iServerPort);
return -1;
}
printf("Error: Can Not Connect To %s:%d ! Reconnect : %d ...\n", pServerIP, iServerPort, iReConnectTimes);
sleep(2);
}
return client_socket;
}
void* Thread_linux(void* para)
{
int iRet = 0;
iRet = TalkToServer(para, MAX_CONNECT_TIMEOUT);
if (iRet == -1)
{
printf("Error: Talk To Server Failed!\n");
}
pthread_exit(NULL);
}
#else
int SendDataToServer_windows(int socketID, char *data, int iBufLen)
{
char buffer[MAX_BUFFER_SIZE];
int iRet = 0;
if (data == NULL)
{
printf("Error: Send Data is NULL!\n");
return -1;
}
memset(buffer, 0, MAX_BUFFER_SIZE);
memcpy(buffer, data, iBufLen);
//<2F><><EFBFBD>ͻ<EFBFBD><CDBB>˷<EFBFBD><CBB7><EFBFBD>buffer<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
iRet = send(socketID, buffer, iBufLen, 0);
if (iRet != iBufLen)
{
printf("Error: send error: %d!\n", GetLastError());
return -1;
}
return 0;
}
int RecvDataFromServer_windows(int socketID, char *buffer, int iBufLen)
{
int length = 0;
if (buffer == NULL)
{
printf("Error: Malloc Failed!\n");
return -1;
}
//<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("Socket Close!\n");
return 0;
}
return length;
}
ULONG __stdcall Thread_windows(void *para)
{
int iRet = 0;
iRet = TalkToServer(para, MAX_CONNECT_TIMEOUT);
if (iRet == -1)
{
printf("Error: Talk To Server Failed!\n");
return -1;
}
return 0;
}
SOCKET ConnectServer_windows(const char* pServerIP, int iServerPort, int iTimeout)
{
WSADATA Ws;
struct sockaddr_in server_addr;
SOCKET client_socket;
int iRet;
int iReConnectTimes = 0;
if (pServerIP == NULL)
{
printf("Error: ServerIP is NULL!\n");
return -1;
}
//<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><EFBFBD><EFBFBD><EFBFBD>internet<65><74><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>(TCP)socket,<2C><>client_socket<65><74><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>socket
client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket == INVALID_SOCKET)
{
printf("Error: Create Socket Failed!\n");
closesocket(client_socket);
return -1;
}
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(pServerIP);
server_addr.sin_port = htons(iServerPort);
memset(server_addr.sin_zero, 0x00, 8);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ӳɹ<D3B3><C9B9><EFBFBD>client_socket<65><74><EFBFBD><EFBFBD><EFBFBD>˿ͻ<CBBF><CDBB><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>socket<65><74><EFBFBD><EFBFBD>
//֧<><D6A7>ʧ<EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD>
while (connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == SOCKET_ERROR)
{
iReConnectTimes ++;
if (iReConnectTimes >= iTimeout)
{
printf("Error: Has Reconnect %d Times! Connect To %s:%d Failed!\n", iReConnectTimes, pServerIP, iServerPort);
return -1;
}
printf("Error: Can Not Connect To %s:%d ! Reconnect : %d ...\n", pServerIP, iServerPort, iReConnectTimes);
Sleep(2000);
}
return client_socket;
}
#endif
int TalkToServer(void* para, int iTimeout)
{
int iRet = 0;
int iPort = 0;
char strIP[MAX_IP_LENGTH];
char strCmd[MAX_CMDLINE_LENGTH];
char *pCmdType = NULL;
char *pPara = NULL;
#ifdef IN_LINUX
int client_socket;
#else
SOCKET client_socket;
#endif
memset(strIP, 0, MAX_IP_LENGTH);
memset(strCmd, 0, MAX_CMDLINE_LENGTH);
iRet = ParseCmd((char*)para, strIP, &iPort, strCmd);
if (iRet == -1)
{
printf("Error: Parse CMD Failed!\n");
return -1;
}
#ifdef IN_LINUX
client_socket = ConnectServer_linux(strIP, iPort, iTimeout);
if (client_socket == -1)
{
printf("Error: ConnectServer Failed!\n");
return -1;
}
#else
client_socket = ConnectServer_windows(strIP, iPort, iTimeout);
if (client_socket == INVALID_SOCKET)
{
printf("Error: ConnectServer Failed!\n");
return -1;
}
#endif
printf("Client Connect Server %s Success!\n", strIP);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pCmdType = strtok(strCmd, "[");
if (pCmdType == NULL)
{
printf("Error: Cmdlist para %s error!\n", para);
#ifdef IN_LINUX
close(client_socket);
#else
closesocket(client_socket);
#endif
return -1;
}
strTerm(pCmdType);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pPara = strtok(NULL, "]");
if (pPara == NULL)
{
printf("Error: Cmdlist para %s error!\n", para);
#ifdef IN_LINUX
close(client_socket);
#else
closesocket(client_socket);
#endif
return -1;
}
strTerm(pPara);
//Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
if (strcmp(COPYFILE, pCmdType) == 0)
{
if (CopyFileFromServer((void*)client_socket, pPara) == -1)
{
printf("Error: Copy File From Server Failed!\n");
#ifdef IN_LINUX
close(client_socket);
#else
closesocket(client_socket);
#endif
return -1;
}
}
//ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD>ִ<EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
else if(strcmp(CMD, pCmdType) == 0)
{
iRet = SendCmdToServer((void*)client_socket, pPara, CMD_FALG_NOWAIT);
if (iRet == -1)
{
printf("Error: Send Data To Server Failed!\n");
#ifdef IN_LINUX
close(client_socket);
#else
closesocket(client_socket);
#endif
return -1;
}
}
else if(strcmp(CMDECHO,pCmdType) == 0)
{
iRet = SendCmdToServer((void*)client_socket, pPara, CMD_ECHO);
if (iRet == -1)
{
printf("Error: Send Data To Server Failed!\n");
#ifdef IN_LINUX
close(client_socket);
#else
closesocket(client_socket);
#endif
return -1;
}
}
//Ϊ<>ȴ<EFBFBD><C8B4>ͻ<EFBFBD><CDBB><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
else if(strcmp(CMDWAIT, pCmdType) == 0)
{
iRet = SendCmdToServer((void*)client_socket, pPara, CMD_FALG_WAIT);
if (iRet == -1)
{
printf("Error: Send Data To Server Failed!\n");
#ifdef IN_LINUX
close(client_socket);
#else
closesocket(client_socket);
#endif
return -1;
}
}
//Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
else if (strcmp(SENDFILE, pCmdType) == 0)
{
if (SendFileToServer((void*)client_socket, pPara) == -1)
{
printf("Error: Send File To Server Failed!\n");
#ifdef IN_LINUX
close(client_socket);
#else
closesocket(client_socket);
#endif
return -1;
}
}
//Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
else if (strcmp(FINDPROC, pCmdType) == 0)
{
if (FindProcessFromServer((void*)client_socket, pPara) == -1)
{
printf("Error: Find Process From Server Failed!\n");
#ifdef IN_LINUX
close(client_socket);
#else
closesocket(client_socket);
#endif
return -1;
}
}
else
{
printf("Error: No Support : %s\n", pCmdType);
#ifdef IN_LINUX
close(client_socket);
#else
closesocket(client_socket);
#endif
return -1;
}
#ifdef IN_LINUX
close(client_socket);
#else
closesocket(client_socket);
#endif
return 0;
}
int SendCmdToServer(void* socketID, char* para, int isWaitFlag)
{
int iRet = 0;
char buf[BUFSIZE];
char strCmd[MAX_CMDLINE_LENGTH];
memset(strCmd, 0, MAX_CMDLINE_LENGTH);
if (CMD_FALG_NOWAIT == isWaitFlag)
{
strcpy(strCmd, CMD);
}
else if(CMD_ECHO == isWaitFlag)
{
strcpy(strCmd, CMDECHO);
}
else
{
strcpy(strCmd, CMDWAIT);
}
strcat(strCmd, "[");
strcat(strCmd, para);
strcat(strCmd, "]");
iRet = strlen(strCmd);
#ifdef IN_LINUX
iRet = SendDataToServer_linux((int)socketID, strCmd, iRet);
#else
iRet = SendDataToServer_windows((SOCKET)socketID, strCmd, iRet);
#endif
if ( iRet == -1)
{
printf("Error: Send Cmd To Server Failed: %s\n", para);
return -1;
}
printf("Send Cmd To Server Success: %s\n", para);
//<2F><><EFBFBD>ȴ<EFBFBD>
if (isWaitFlag == CMD_FALG_NOWAIT)
{
return 0;
}
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>Ӧ<EFBFBD><D3A6>
else if(isWaitFlag == CMD_ECHO)
{
memset(buf, 0, BUFSIZE);
recv((int)socketID, buf, BUFSIZE, 0);
printf("%s",buf);
while(recv((int)socketID, buf, BUFSIZE, 0) != 0)
{
printf("%s",buf);
}
}
else
{
iRet = WaitRspFromServer(socketID);
if ( iRet == -1)
{
printf("Error: Wait for Rsp From Server Failed!\n");
return -1;
}
else if (iRet == RET_OK)
{
printf("---------\n");
printf("Response: OK!\n");
}
else if (iRet == RET_FAILED)
{
printf("---------\n");
printf("Response: Failed!\n");
printf(" Server Run Cmd Failed! No such file or directory, or permission denied ...\n Please Check!\n");
}
printf("---------\n");
}
return iRet;
}
int ParseCmd(char *data, char *ip, int *port, char *cmd)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned char str[MAX_CMDLINE_LENGTH];
char * pServerIP = NULL;
char * pServerPort = NULL;
char * pCmd = NULL;
memset(str, 0, MAX_CMDLINE_LENGTH);
strncpy(str, data, MAX_CMDLINE_LENGTH);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP
pServerIP = strtok(str, "#");
if (pServerIP == NULL)
{
return -1;
}
strTerm(pServerIP);
strncpy(ip, pServerIP, MAX_IP_LENGTH);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PORT
pServerPort = strtok(NULL, "#");
if (pServerPort == NULL)
{
return -1;
}
strTerm(pServerPort);
*port = atoi(pServerPort);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
pCmd = strtok(NULL, "#");
if (pCmd == NULL)
{
return -1;
}
strTerm(pCmd);
strncpy(cmd, pCmd, MAX_CMDLINE_LENGTH);
return 0;
}
int CopyFileFromServer(void* socketID, char *data)
{
char strPara[MAX_CMDLINE_LENGTH];
char strBuffer[MAX_BUFFER_SIZE];
char *pFrom = NULL;
char *pTo = NULL;
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 (data == NULL)
{
printf("Error: Send Data is NULL!\n");
return -1;
}
memset(strPara, 0, MAX_CMDLINE_LENGTH);
memset(strBuffer, 0, MAX_BUFFER_SIZE);
//<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ȫ·<C8AB><C2B7><EFBFBD><EFBFBD>
pFrom = strtok(data, ",");
if (pFrom == NULL)
{
printf("Cmdlist para %s error!\n", strPara);
return -1;
}
strTerm(pFrom);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ڿͻ<DABF><CDBB>˵Ĵ<CBB5><C4B4><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>ȫ·<C8AB><C2B7><EFBFBD><EFBFBD>
pTo = strtok(NULL, ",");
if (pTo == NULL)
{
printf("Cmdlist para %s error!\n", strPara);
return -1;
}
strTerm(pTo);
//<2F><><EFBFBD><EFBFBD><ECB7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strcpy(strPara, COPYFILE);
strcat(strPara, "[");
strcat(strPara, pFrom);
strcat(strPara, "]");
iRet = strlen(strPara);
//<2F><><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#ifdef IN_LINUX
iRet = SendDataToServer_linux(socket, strPara, iRet);
#else
iRet = SendDataToServer_windows(socket, strPara, iRet);
#endif
if ( iRet == -1)
{
printf("Error: Send Data To Server Failed: %s\n", strPara);
return -1;
}
printf("Send Data To Server Success: %s\n", strPara);
//<2F><><EFBFBD><EFBFBD>׼<EFBFBD><D7BC>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD>
fr = fopen(pTo, "wb");
if(fr == NULL)
{
printf("Error: Open File :%s Failed!\n", pTo);
return -1;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
#ifdef IN_LINUX
iRet = RecvDataFromServer_linux(socket, strBuffer, MAX_BUFFER_SIZE);
#else
iRet = RecvDataFromServer_windows(socket, strBuffer, MAX_BUFFER_SIZE);
#endif
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӹر<D3B9>socket
if (iRet == -1)
{
#ifdef IN_LINUX
close(socket);
#else
closesocket(socket);
#endif
}
//<2F><><EFBFBD>յ<EFBFBD><D5B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD>
while ( iRet > 0)
{
iTotal += iRet;
if (fwrite(strBuffer, sizeof(char), iRet, fr) != iRet)
{
printf("Error: Write File Failed : %s\n", pTo);
fclose(fr);
return -1;
}
//<2F><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
if (SendRspToSever(socketID, RSP_OK) == -1)
{
printf("Error: Send Rsp To Server Failed!\n");
fclose(fr);
return -1;
}
memset(strBuffer, 0, MAX_BUFFER_SIZE);
#ifdef IN_LINUX
iRet = RecvDataFromServer_linux(socket, strBuffer, MAX_BUFFER_SIZE);
#else
iRet = RecvDataFromServer_windows(socket, strBuffer, MAX_BUFFER_SIZE);
#endif
}
printf("Copy File length: %d\n", iTotal);
fclose(fr);
return 0;
}
int SendFileToServer(void* socketID, char *data)
{
char strPara[MAX_CMDLINE_LENGTH];
char strBuffer[MAX_BUFFER_SIZE];
char *pFrom = NULL;
char *pTo = NULL;
FILE *fr = NULL;
int iRet = 0;
int iLen = 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 (data == NULL)
{
printf("Error: Send Data is NULL!\n");
return -1;
}
memset(strPara, 0, MAX_CMDLINE_LENGTH);
memset(strBuffer, 0, MAX_BUFFER_SIZE);
//<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>͵Ŀͻ<C4BF><CDBB>˵<EFBFBD><CBB5>ļ<EFBFBD><C4BC><EFBFBD>ȫ·<C8AB><C2B7><EFBFBD><EFBFBD>
pFrom = strtok(data, ",");
if (pFrom == NULL)
{
printf("Cmdlist para %s error!\n", strPara);
return -1;
}
strTerm(pFrom);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD>˵Ĵ<CBB5><C4B4><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>ȫ·<C8AB><C2B7><EFBFBD><EFBFBD>
pTo = strtok(NULL, ",");
if (pTo == NULL)
{
printf("Cmdlist para %s error!\n", strPara);
return -1;
}
strTerm(pTo);
//<2F><><EFBFBD><EFBFBD><ECB7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strcpy(strPara, SENDFILE);
strcat(strPara, "[");
strcat(strPara, pTo);
strcat(strPara, "]");
iRet = strlen(strPara);
//<2F><><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#ifdef IN_LINUX
iLen = SendDataToServer_linux(socket, strPara, iRet);
#else
iLen = SendDataToServer_windows(socket, strPara, iRet);
#endif
if ( iLen == -1)
{
printf("Error: Send Data To Server Failed: %s\n", strPara);
return -1;
}
printf("Send Data To Server Success: %s\n", strPara);
//<2F>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>Ϣ
iRet = WaitRspFromServer(socketID);
if ( iRet == -1)
{
printf("Error: Wait for Rsp From Server Failed!\n");
return -1;
}
else if (iRet == RET_FAILED)
{
printf("Error: Server Error!\n");
return -1;
}
printf("Server Read To Receive File!\n");
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
fr = fopen(pFrom, "rb");
if(fr == NULL)
{
printf("Error: Open File :%s Failed!\n", pFrom);
return -1;
}
printf("Sending File to Server...\n");
//<2F><>ʼ<EFBFBD><CABC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while ((iLen = fread(strBuffer, sizeof(char), MAX_BUFFER_SIZE-1, fr)) > 0)
{
iTotal += iLen;
#ifdef IN_LINUX
iRet = SendDataToServer_linux(socket, strBuffer, iLen);
#else
iRet = SendDataToServer_windows(socket, strBuffer, iLen);
#endif
if (iRet == -1)
{
printf("Error: Send Data To Server Failed!\n");
fclose(fr);
return -1;
}
memset(strBuffer, 0, MAX_BUFFER_SIZE);
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>Ӧ<EFBFBD><D3A6>
if (WaitRspFromServer(socketID) == -1)
{
printf("Error: Wait for Rsp From Server Failed!\n");
return -1;
}
}
printf("Send File Length: %ld\n", iTotal);
fclose(fr);
return 0;
}
int FindProcessFromServer(void* socketID, char *data)
{
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
memset(strCmd, 0, MAX_CMDLINE_LENGTH);
strcpy(strCmd, FINDPROC);
strcat(strCmd, "[");
strcat(strCmd, data);
strcat(strCmd, "]");
iRet = strlen(strCmd);
#ifdef IN_LINUX
iRet = SendDataToServer_linux((int)socketID, strCmd, iRet);
#else
iRet = SendDataToServer_windows((SOCKET)socketID, strCmd, iRet);
#endif
if ( iRet == -1)
{
printf("Error: Send Data To Server Failed: %s\n", strCmd);
return -1;
}
printf("Send Data To Server Success: %s\n", strCmd);
//<2F>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>Ϣ
iRet = WaitRspFromServer(socketID);
if ( iRet == -1)
{
printf("Error: Wait for Rsp From Server Failed!\n");
return -1;
}
if (iRet == RET_OK)
{
printf("The Process %s Run Status: YES\n", data);
}
else if (iRet == RET_FAILED)
{
printf("The Process %s Run Status: NO\n", data);
}
return iRet;
}
int WaitRspFromServer(void* socketID)
{
int iRet;
char strPara[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
memset(strPara, 0, MAX_CMDLINE_LENGTH);
#ifdef IN_LINUX
iRet = RecvDataFromServer_linux(socket, strPara, MAX_CMDLINE_LENGTH);
#else
iRet = RecvDataFromServer_windows(socket, strPara, MAX_CMDLINE_LENGTH);
#endif
if (iRet > 0)
{
iRet = ParseRsp(strPara);
if (iRet == -1)
{
printf("Error: Parse Rsp %s Failed!\n", strPara);
return -1;
}
return iRet;
}
else
{
return -1;
}
}
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 SendRspToSever(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 = SendDataToServer_linux(socket, strRsp, strlen(strRsp));
#else
iRet = SendDataToServer_windows(socket, strRsp, strlen(strRsp));
#endif
if (iRet == -1)
{
printf("Error: Send Data To Client Failed!\n");
return -1;
}
return 0;
}
int CreateSubThread(char *para)
{
#ifdef IN_LINUX
pthread_t child_thread;
#else
HANDLE child_thread;
#endif
if (para == NULL)
{
printf("Error: CreateThread func para is NULL\n");
return -1;
}
#ifdef IN_LINUX
if( pthread_create(&child_thread, NULL, Thread_linux, (void *)para) < 0 )
{
printf("Error: Create Thread Failed : %s\n", strerror(errno));
return -1;
}
//<2F>ȴ<EFBFBD><C8B4>߳<EFBFBD><DFB3>˳<EFBFBD>
if(child_thread != 0)
{
pthread_join(child_thread, NULL);
}
#else
child_thread = CreateThread(NULL, 0, Thread_windows, (void *)para, 0, NULL);
if (child_thread == NULL)
{
printf("Error: Create Thread Failed!\n");
return -1;
}
WaitForSingleObject(child_thread, INFINITE);
#endif
return 0;
}
int RunCmdlist()
{
FILE* fr = NULL;
char strCmdLine[MAX_BUFFER_SIZE];
int iCmdNum = 1;
memset(strCmdLine, 0, MAX_BUFFER_SIZE);
// <20><>ȡcmdlist<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fr = fopen(CMDLIST, "r");
if(fr == NULL)
{
printf("open the file of %s failed!\n", CMDLIST);
return -1;
}
while (fgets(strCmdLine, MAX_BUFFER_SIZE, fr) != NULL)
{
printf("=============== begin %d ===============\n", iCmdNum);
//<2F><><EFBFBD><EFBFBD><EFBFBD>̣߳<DFB3><CCA3><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>
CreateSubThread(strCmdLine);
printf("=============== end %d ===============\n", iCmdNum);
iCmdNum++;
}
fclose(fr);
return 0;
}
int RunCmd(int argc, char **argv)
{
int iRet = 0;
int iTimeout = MAX_CONNECT_TIMEOUT;
char szCmd[MAX_CMDLINE_LENGTH];
printf("=============== begin ===============\n");
memset(szCmd, 0, MAX_CMDLINE_LENGTH);
strncpy(szCmd, argv[1], MAX_CMDLINE_LENGTH);
if (argc >= 3)
{
iTimeout = atoi(argv[2]);
}
iRet = TalkToServer(szCmd, iTimeout);
if (iRet == -1)
{
printf("Error: Talk To Server Failed!\n");
}
printf("=============== end ===============\n");
return 0;
}
int main(int argc, char **argv)
{
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (argc >= 2)
{
RunCmd(argc, argv);
}
//ִ<><D6B4>cmdlist<73>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
else
{
RunCmdlist();
}
return 0;
}