自己写的Telnet服务端,客户端用Windows自带的,现在要求要达到远程执行一些dos命令,在返回结果就行,但是执行过程中遇到一些命令执行结果不全,如:dir、ver等等,其他的ipcongfig help之类还蛮全的,就是查不到原因,请大神指点一下!!!
代码如下(不太长,重点应该在创建进程那边出的错!请指定!!):
#include <Winsock2.h>
#include <stdio.h>
#include<string>
#include<cstring>
#include<windows.h>
#include<Winbase.h>
#include<stdafx.h>
#include <fcntl.h>
#pragma comment(lib,"ws2_32")struct CMD
{
char cmdbuffer[50];
}cmd[20];
int i=0;
char buffer[10000]; //执行结果
char command[50]; //命令接收数组
void ShuJu()
{ /*创建句柄及初始化*/
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
return;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
// si.wShowWindow = SW_SHOW;
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
// si.dwFlags = STARTF_USESHOWWINDOW;
if (!CreateProcess(NULL,command,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
CloseHandle(hWrite);
CloseHandle(hRead);
return;
}
CloseHandle(hWrite);
memset(buffer,0,10000);
DWORD bytesRead;
while (true)
{
bool bret=ReadFile(hRead,buffer,10000,&bytesRead,NULL); if (bret)
{
if (bytesRead == 0)
break;
if (bytesRead <10000)
break;
}
else
{
DWORD i = GetLastError();
break;
}
}
CloseHandle(hRead);
printf("数组buffer为:%s\n",buffer);
int bufferstr=strlen(buffer);
printf("命令的长度为:%d\n",bufferstr);
// printf("指令执行完毕!\n");
printf("bytesRead长度为:%d",bytesRead);
}/*主函数*/
void main()
{
/*创建套接字*/
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if (err != 0)
{
return;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
SOCKET socSrv;
socSrv = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000); bind(socSrv,(SOCKADDR*)&addrSrv,sizeof(addrSrv));
listen(socSrv,50);
SOCKADDR_IN addrClient;
int addrLen = sizeof(SOCKADDR_IN);
SOCKET socClient = accept(socSrv,(SOCKADDR*)&addrClient,&addrLen); /*身份认证!!接收客户端申请,然后对客户端发送命令输入提示,打开客户端回显*/
char SS[10],S1[10],S2[10];
recv(socClient,SS,10,0);
char ZH[10]="ddd";char MM[10]="123"; do{
send(socClient,"请输入登录账号>",sizeof("请输入登录账号>"),0);
char *r;
r=S1;
while(1)
{
recv(socClient,r,sizeof(r),0);
if(*r=='\r')break;
if(*r=='\b')
{ char BS1[3];
BS1[0]=46;
BS1[1]=8;
BS1[2]='\0';
send(socClient,BS1,sizeof(BS1),0);
r--;
}
else r++;
}
*r='\0'; /*末尾补\0*/
send(socClient,"请输入密码>",sizeof("请输入密码>"),0);
char *t;
t=S2;
while(1)
{
recv(socClient,t,sizeof(t),0);
char hx[4];
hx[0]=46;
hx[1]=8;
hx[2]=8;
hx[3]='*';
send(socClient,hx,sizeof(hx),0);
if(*t=='\r')
{char hx1[1];hx1[0]=8;send(socClient,hx1,sizeof(hx1),0);break;}
if(*t=='\b')
{ char BS2[3];
BS2[0]=8;
BS2[1]=46;
BS2[2]='\0';
send(socClient,BS2,sizeof(BS2),0);
t--;
}
else t++;
}
*t='\0'; /*末尾补\0*/
}while(strcmp(ZH,S1)!=0||strcmp(MM,S2)!=0);
send(socClient,"身份验证通过!",sizeof("身份验证通过!"),0);
/*程序主体,实现远程操作及维护*/
send(socClient,"\r\n请输入命令>",sizeof("\r\n请输入命令>"),0);
memset(command,0,50);
while(1)
{
char fx[50];memset(fx,0,50);
char recvbuf[50]=" ";
char *p;
p=recvbuf;
// while(1)
// {
recv(socClient,fx,sizeof(fx),0);
if(fx[0]==27&&fx[1]==91)
{
switch(fx[2])
{
case 65:
printf("数组fx为:%s",fx);
send(socClient,cmd[i].cmdbuffer,sizeof(cmd[i].cmdbuffer),0);
strcpy(command,cmd[i].cmdbuffer);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
i--;
// send(socClient,"执行指令telnet!\r\n请继续输入命令>",sizeof("执行指令telnet!\r\n请继续输入命令>"),0);
break;
case 66:
printf("数组fx为:%s",fx);
send(socClient,"判断出是向下键!\r\n继续输入命令>",sizeof("判断出是向下键!\r\n继续输入命令>"),0);
break;
case 67:
printf("数组fx为:%s",fx);
send(socClient,"判断出是向右键!\r\n继续输入命令>",sizeof("判断出是向右键!\r\n继续输入命令>"),0);
break;
case 68:
printf("数组fx为:%s",fx);
send(socClient,"判断出是向左键!\r\n继续输入命令>",sizeof("判断出是向左键!\r\n继续输入命令>"),0);
break;
}
continue;
}
// break;
// }
// fx[3]='\0';
recvbuf[0]=fx[0];
p++;
/*接收客户端发来的命令*/
while(1)
{
recv(socClient,p,sizeof(p),0);
if(*p=='\r')break;
else if(*p=='\b')
{ char BS[3];
BS[0]=46;
BS[1]=8;
BS[2]='\0';
send(socClient,BS,sizeof(BS),0);
p--;
}
else p++;
int STRLEN=strlen(recvbuf);
printf("数组buf为:%s;数组长度为:%d.\n",recvbuf,STRLEN);
}
*p='\0'; /*末尾补'\0',命令接受完毕!*/
Sleep(300);
/*对命令解析,执行并返回结果*/
/*调用windows的API函数执行一些Dos操作*/
strcpy(command,"Cmd.exe /C ");
/*help命令*/
if(strcmp(recvbuf,"?")==0||strcmp(recvbuf,"help")==0)
{
strcat(command,recvbuf);
ShuJu();printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令help!\r\n请继续输入命令>",sizeof("执行指令help!\r\n请继续输入命令>"),0);
}
/*ipconfig命令*/
else if(strcmp(recvbuf,"ipconfig")==0)
{
strcat(command,recvbuf);
ShuJu();printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令ipconfig!\r\n请继续输入命令>",sizeof("执行指令ipconfig!\r\n请继续输入命令>"),0);
}
/*ipconfig /all命令*/
else if(strcmp(recvbuf,"ipconfig /all")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令ipconfig /all!\r\n请继续输入命令>",sizeof("执行指令ipconfig /all!\r\n请继续输入命令>"),0);
}
/*cd ..命令*/
else if(strcmp(recvbuf,"cd ..")==0)
{
strcat(command,recvbuf);
}
/*telnet命令*/
else if(strcmp(recvbuf,"telnet")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令telnet!\r\n请继续输入命令>",sizeof("执行指令telnet!\r\n请继续输入命令>"),0);
}
/*ver命令*/
else if(strcmp(recvbuf,"ver")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令ver!\r\n请继续输入命令>",sizeof("执行指令ver!\r\n请继续输入命令>"),0);
}
/*dir命令*/
else if(strcmp(recvbuf,"dir")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令dir!\r\n请继续输入命令>",sizeof("执行指令dir!\r\n请继续输入命令>"),0);
}
/*quit命令*/
else if(strcmp(recvbuf,"quit")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令quit!\r\n请继续输入命令>",sizeof("执行指令quit!\r\n请继续输入命令>"),0);
}
/*date命令*/
else if(strcmp(recvbuf,"date")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令date!\r\n请继续输入命令>",sizeof("执行指令date!\r\n请继续输入命令>"),0);
}
/*mem命令*/
else if(strcmp(recvbuf,"mem")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令mem!\r\n请继续输入命令>",sizeof("执行指令mem!\r\n请继续输入命令>"),0);
}
/*exit命令*/
else if(strcmp(recvbuf,"exit")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令exit!\r\n请继续输入命令>",sizeof("执行指令exit!\r\n请继续输入命令>"),0);
}
else send(socClient,"指令错误,请重新输入>",sizeof("指令错误,请重新输入>")+1,0);
strcpy(cmd[i].cmdbuffer,command);
i++;
Sleep(200);
}
closesocket(socClient);
closesocket(socSrv);
WSACleanup();
}
/*程序结束*/
后续还要达到dos更多功能,以及改成非阻塞模式、Linux下运行等。。
代码如下(不太长,重点应该在创建进程那边出的错!请指定!!):
#include <Winsock2.h>
#include <stdio.h>
#include<string>
#include<cstring>
#include<windows.h>
#include<Winbase.h>
#include<stdafx.h>
#include <fcntl.h>
#pragma comment(lib,"ws2_32")struct CMD
{
char cmdbuffer[50];
}cmd[20];
int i=0;
char buffer[10000]; //执行结果
char command[50]; //命令接收数组
void ShuJu()
{ /*创建句柄及初始化*/
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
return;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
// si.wShowWindow = SW_SHOW;
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
// si.dwFlags = STARTF_USESHOWWINDOW;
if (!CreateProcess(NULL,command,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
CloseHandle(hWrite);
CloseHandle(hRead);
return;
}
CloseHandle(hWrite);
memset(buffer,0,10000);
DWORD bytesRead;
while (true)
{
bool bret=ReadFile(hRead,buffer,10000,&bytesRead,NULL); if (bret)
{
if (bytesRead == 0)
break;
if (bytesRead <10000)
break;
}
else
{
DWORD i = GetLastError();
break;
}
}
CloseHandle(hRead);
printf("数组buffer为:%s\n",buffer);
int bufferstr=strlen(buffer);
printf("命令的长度为:%d\n",bufferstr);
// printf("指令执行完毕!\n");
printf("bytesRead长度为:%d",bytesRead);
}/*主函数*/
void main()
{
/*创建套接字*/
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if (err != 0)
{
return;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
SOCKET socSrv;
socSrv = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000); bind(socSrv,(SOCKADDR*)&addrSrv,sizeof(addrSrv));
listen(socSrv,50);
SOCKADDR_IN addrClient;
int addrLen = sizeof(SOCKADDR_IN);
SOCKET socClient = accept(socSrv,(SOCKADDR*)&addrClient,&addrLen); /*身份认证!!接收客户端申请,然后对客户端发送命令输入提示,打开客户端回显*/
char SS[10],S1[10],S2[10];
recv(socClient,SS,10,0);
char ZH[10]="ddd";char MM[10]="123"; do{
send(socClient,"请输入登录账号>",sizeof("请输入登录账号>"),0);
char *r;
r=S1;
while(1)
{
recv(socClient,r,sizeof(r),0);
if(*r=='\r')break;
if(*r=='\b')
{ char BS1[3];
BS1[0]=46;
BS1[1]=8;
BS1[2]='\0';
send(socClient,BS1,sizeof(BS1),0);
r--;
}
else r++;
}
*r='\0'; /*末尾补\0*/
send(socClient,"请输入密码>",sizeof("请输入密码>"),0);
char *t;
t=S2;
while(1)
{
recv(socClient,t,sizeof(t),0);
char hx[4];
hx[0]=46;
hx[1]=8;
hx[2]=8;
hx[3]='*';
send(socClient,hx,sizeof(hx),0);
if(*t=='\r')
{char hx1[1];hx1[0]=8;send(socClient,hx1,sizeof(hx1),0);break;}
if(*t=='\b')
{ char BS2[3];
BS2[0]=8;
BS2[1]=46;
BS2[2]='\0';
send(socClient,BS2,sizeof(BS2),0);
t--;
}
else t++;
}
*t='\0'; /*末尾补\0*/
}while(strcmp(ZH,S1)!=0||strcmp(MM,S2)!=0);
send(socClient,"身份验证通过!",sizeof("身份验证通过!"),0);
/*程序主体,实现远程操作及维护*/
send(socClient,"\r\n请输入命令>",sizeof("\r\n请输入命令>"),0);
memset(command,0,50);
while(1)
{
char fx[50];memset(fx,0,50);
char recvbuf[50]=" ";
char *p;
p=recvbuf;
// while(1)
// {
recv(socClient,fx,sizeof(fx),0);
if(fx[0]==27&&fx[1]==91)
{
switch(fx[2])
{
case 65:
printf("数组fx为:%s",fx);
send(socClient,cmd[i].cmdbuffer,sizeof(cmd[i].cmdbuffer),0);
strcpy(command,cmd[i].cmdbuffer);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
i--;
// send(socClient,"执行指令telnet!\r\n请继续输入命令>",sizeof("执行指令telnet!\r\n请继续输入命令>"),0);
break;
case 66:
printf("数组fx为:%s",fx);
send(socClient,"判断出是向下键!\r\n继续输入命令>",sizeof("判断出是向下键!\r\n继续输入命令>"),0);
break;
case 67:
printf("数组fx为:%s",fx);
send(socClient,"判断出是向右键!\r\n继续输入命令>",sizeof("判断出是向右键!\r\n继续输入命令>"),0);
break;
case 68:
printf("数组fx为:%s",fx);
send(socClient,"判断出是向左键!\r\n继续输入命令>",sizeof("判断出是向左键!\r\n继续输入命令>"),0);
break;
}
continue;
}
// break;
// }
// fx[3]='\0';
recvbuf[0]=fx[0];
p++;
/*接收客户端发来的命令*/
while(1)
{
recv(socClient,p,sizeof(p),0);
if(*p=='\r')break;
else if(*p=='\b')
{ char BS[3];
BS[0]=46;
BS[1]=8;
BS[2]='\0';
send(socClient,BS,sizeof(BS),0);
p--;
}
else p++;
int STRLEN=strlen(recvbuf);
printf("数组buf为:%s;数组长度为:%d.\n",recvbuf,STRLEN);
}
*p='\0'; /*末尾补'\0',命令接受完毕!*/
Sleep(300);
/*对命令解析,执行并返回结果*/
/*调用windows的API函数执行一些Dos操作*/
strcpy(command,"Cmd.exe /C ");
/*help命令*/
if(strcmp(recvbuf,"?")==0||strcmp(recvbuf,"help")==0)
{
strcat(command,recvbuf);
ShuJu();printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令help!\r\n请继续输入命令>",sizeof("执行指令help!\r\n请继续输入命令>"),0);
}
/*ipconfig命令*/
else if(strcmp(recvbuf,"ipconfig")==0)
{
strcat(command,recvbuf);
ShuJu();printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令ipconfig!\r\n请继续输入命令>",sizeof("执行指令ipconfig!\r\n请继续输入命令>"),0);
}
/*ipconfig /all命令*/
else if(strcmp(recvbuf,"ipconfig /all")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令ipconfig /all!\r\n请继续输入命令>",sizeof("执行指令ipconfig /all!\r\n请继续输入命令>"),0);
}
/*cd ..命令*/
else if(strcmp(recvbuf,"cd ..")==0)
{
strcat(command,recvbuf);
}
/*telnet命令*/
else if(strcmp(recvbuf,"telnet")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令telnet!\r\n请继续输入命令>",sizeof("执行指令telnet!\r\n请继续输入命令>"),0);
}
/*ver命令*/
else if(strcmp(recvbuf,"ver")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令ver!\r\n请继续输入命令>",sizeof("执行指令ver!\r\n请继续输入命令>"),0);
}
/*dir命令*/
else if(strcmp(recvbuf,"dir")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令dir!\r\n请继续输入命令>",sizeof("执行指令dir!\r\n请继续输入命令>"),0);
}
/*quit命令*/
else if(strcmp(recvbuf,"quit")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令quit!\r\n请继续输入命令>",sizeof("执行指令quit!\r\n请继续输入命令>"),0);
}
/*date命令*/
else if(strcmp(recvbuf,"date")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令date!\r\n请继续输入命令>",sizeof("执行指令date!\r\n请继续输入命令>"),0);
}
/*mem命令*/
else if(strcmp(recvbuf,"mem")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令mem!\r\n请继续输入命令>",sizeof("执行指令mem!\r\n请继续输入命令>"),0);
}
/*exit命令*/
else if(strcmp(recvbuf,"exit")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"执行指令exit!\r\n请继续输入命令>",sizeof("执行指令exit!\r\n请继续输入命令>"),0);
}
else send(socClient,"指令错误,请重新输入>",sizeof("指令错误,请重新输入>")+1,0);
strcpy(cmd[i].cmdbuffer,command);
i++;
Sleep(200);
}
closesocket(socClient);
closesocket(socSrv);
WSACleanup();
}
/*程序结束*/
后续还要达到dos更多功能,以及改成非阻塞模式、Linux下运行等。。
#include <stdio.h>
#include <stdlib.h>int main( void )
{ char psBuffer[128];
FILE *pPipe; /* Run DIR so that it writes its output to a pipe. Open this
* pipe with read text attribute so that we can read it
* like a text file.
*/ if( (pPipe = _popen( "dir /on /p", "rt" )) == NULL )
exit( 1 ); /* Read pipe until end of file, or an error occurs. */ while(fgets(psBuffer, 128, pPipe))
{
printf(psBuffer);
}
/* Close pipe and print return value of pPipe. */
if (feof( pPipe))
{
printf( "\nProcess returned %d\n", _pclose( pPipe ) );
}
else
{
printf( "Error: Failed to read the pipe to the end.\n");
}
}
谢谢你的回复!
改成这样:
#include <Winsock2.h>
#include <stdio.h>
#include<string>
#include<cstring>
#include<windows.h>
#include<Winbase.h>
#include<stdafx.h>
#include <fcntl.h>
#pragma comment(lib,"ws2_32")struct CMD
{
char cmdbuffer[50];
}cmd[20];
int i=0;
char buffer[10240]; //执行结果
char command[50]; //命令接收数组
void ShuJu()
{
FILE *pPipe; /* Run DIR so that it writes its output to a pipe. Open this
* pipe with read text attribute so that we can read it
* like a text file.
*/ if( (pPipe = _popen(command, "rt" )) == NULL )
exit( 1 ); /* Read pipe until end of file, or an error occurs. */
memset(buffer,0,10240);
char psBuffer[1000]=" ";
while(fgets(psBuffer,1000, pPipe))
{
strcat(buffer,psBuffer);
strcat(buffer,"\r");
}
printf(buffer);
/* Close pipe and print return value of pPipe. */
if (feof( pPipe))
{
printf( "\nProcess returned %d\n", _pclose( pPipe ) );
}
else
{
printf( "Error: Failed to read the pipe to the end.\n");
}
}/*主函数*/
void main()
{
/*创建套接字*/
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if (err != 0)
{
return;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
SOCKET socSrv;
socSrv = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000); bind(socSrv,(SOCKADDR*)&addrSrv,sizeof(addrSrv));
listen(socSrv,50);
SOCKADDR_IN addrClient;
int addrLen = sizeof(SOCKADDR_IN);
SOCKET socClient = accept(socSrv,(SOCKADDR*)&addrClient,&addrLen); /*身份认证!!接收客户端申请,然后对客户端发送命令输入提示,打开客户端回显*/
char SS[10],S1[10],S2[10];
recv(socClient,SS,10,0);
char ZH[10]="zte";char MM[10]="123"; do{
send(socClient,"请输入登录账号>",sizeof("请输入登录账号>"),0);
char *r;
r=S1;
while(1)
{
recv(socClient,r,sizeof(r),0);
if(*r=='\r')break;
if(*r=='\b')
{ char BS1[3];
BS1[0]=46;
BS1[1]=8;
BS1[2]='\0';
send(socClient,BS1,sizeof(BS1),0);
r--;
}
else r++;
}
*r='\0'; /*末尾补\0*/
send(socClient,"请输入密码>",sizeof("请输入密码>"),0);
char *t;
t=S2;
while(1)
{
recv(socClient,t,sizeof(t),0);
char hx[4];
hx[0]=46;
hx[1]=8;
hx[2]=8;
hx[3]='*';
send(socClient,hx,sizeof(hx),0);
if(*t=='\r')
{char hx1[1];hx1[0]=8;send(socClient,hx1,sizeof(hx1),0);break;}
if(*t=='\b')
{ char BS2[3];
BS2[0]=8;
BS2[1]=46;
BS2[2]='\0';
send(socClient,BS2,sizeof(BS2),0);
t--;
}
else t++;
}
*t='\0'; /*末尾补\0*/
}while(strcmp(ZH,S1)!=0||strcmp(MM,S2)!=0);
send(socClient,"身份验证通过!",sizeof("身份验证通过!"),0);
/*程序主体,实现远程操作及维护*/
send(socClient,"\r\n请输入命令>",sizeof("\r\n请输入命令>"),0);
while(1)
{
memset(command,0,50);
strcpy(command,"Cmd.exe /C ");
char fx[50];memset(fx,0,50);
char recvbuf[50]=" ";
char *p;
p=recvbuf;
recv(socClient,fx,sizeof(fx),0);
if(fx[0]==27&&fx[1]==91)
{
switch(fx[2])
{
case 65:
i--;
printf("数组fx为:%s",fx);
send(socClient,cmd[i].cmdbuffer,sizeof(cmd[i].cmdbuffer),0);
strcat(command,cmd[i].cmdbuffer);
break;
case 66:
i++;
send(socClient,cmd[i].cmdbuffer,sizeof(cmd[i].cmdbuffer),0);
strcat(command,cmd[i].cmdbuffer);
break;
case 67:
printf("数组fx为:%s",fx);
send(socClient,"判断出是向右键!\r\n继续输入命令>",sizeof("判断出是向右键!\r\n继续输入命令>"),0);
break;
case 68:
printf("数组fx为:%s",fx);
send(socClient,"判断出是向左键!\r\n继续输入命令>",sizeof("判断出是向左键!\r\n继续输入命令>"),0);
break;
}
send(socClient,"\r\n",sizeof("\r\n"),0);
Sleep(1000);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"指令执行完毕!\r\n请继续输入命令>",sizeof("指令执行完毕!\r\n请继续输入命令>"),0);
continue;
}
recvbuf[0]=fx[0];
p++;
/*接收客户端发来的命令*/
while(1)
{
recv(socClient,p,sizeof(p),0);
if(*p=='\r')break;
else if(*p=='\b')
{ char BS[3];
BS[0]=46;
BS[1]=8;
BS[2]='\0';
send(socClient,BS,sizeof(BS),0);
p--;
}
else p++;
int STRLEN=strlen(recvbuf);
printf("数组buf为:%s;数组长度为:%d.\n",recvbuf,STRLEN);
}
*p='\0'; /*末尾补'\0',命令接受完毕!*/
/*对命令解析,执行并返回结果*/
/*调用windows的API函数执行一些Dos操作*/
/*help命令*/
if(strcmp(recvbuf,"?")==0||strcmp(recvbuf,"help")==0)
{
strcat(command,recvbuf);
ShuJu();printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"指令执行完毕!\r\n请继续输入命令>",sizeof("指令执行完毕!\r\n请继续输入命令>"),0);
}
/*ipconfig命令*/
else if(strcmp(recvbuf,"ipconfig")==0)
{
strcat(command,recvbuf);
ShuJu();printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"指令执行完毕!\r\n请继续输入命令>",sizeof("指令执行完毕!\r\n请继续输入命令>"),0);
}
/*ipconfig /all命令*/
else if(strcmp(recvbuf,"ipconfig /all")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"指令执行完毕!\r\n请继续输入命令>",sizeof("指令执行完毕!\r\n请继续输入命令>"),0);
}
/*cd ..命令*/
else if(strcmp(recvbuf,"cd ..")==0)
{
strcat(command,recvbuf);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"指令执行完毕!\r\n请继续输入命令>",sizeof("指令执行完毕!\r\n请继续输入命令>"),0);
}
/*telnet命令*/
else if(strcmp(recvbuf,"telnet")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"指令执行完毕!\r\n请继续输入命令>",sizeof("指令执行完毕!\r\n请继续输入命令>"),0);
}
/*ver命令*/
else if(strcmp(recvbuf,"ver")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"指令执行完毕!\r\n请继续输入命令>",sizeof("指令执行完毕!\r\n请继续输入命令>"),0);
}
/*dir命令*/
else if(strcmp(recvbuf,"dir")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"指令执行完毕!\r\n请继续输入命令>",sizeof("指令执行完毕!\r\n请继续输入命令>"),0);
}
/*quit命令*/
else if(strcmp(recvbuf,"quit")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"指令执行完毕!\r\n请继续输入命令>",sizeof("指令执行完毕!\r\n请继续输入命令>"),0);
}
/*date命令*/
else if(strcmp(recvbuf,"date")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"指令执行完毕!\r\n请继续输入命令>",sizeof("指令执行完毕!\r\n请继续输入命令>"),0);
}
/*mem命令*/
else if(strcmp(recvbuf,"mem")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"指令执行完毕!\r\n请继续输入命令>",sizeof("指令执行完毕!\r\n请继续输入命令>"),0);
}
/*exit命令*/
else if(strcmp(recvbuf,"exit")==0)
{
strcat(command,recvbuf);
ShuJu();
printf("打印command:%s",command);
send(socClient,buffer,sizeof(buffer),0);
send(socClient,"指令执行完毕!\r\n请继续输入命令>",sizeof("指令执行完毕!\r\n请继续输入命令>"),0);
}
else send(socClient,"指令错误,请重新输入>",sizeof("指令错误,请重新输入>")+1,0);
if(i==20)i=0;
memset(cmd[i].cmdbuffer,0,50);
strcpy(cmd[i].cmdbuffer,recvbuf);
i++;
}
closesocket(socClient);
closesocket(socSrv);
WSACleanup();
}
/*程序结束*/
有点小问题“?”和“help”执行结果传不过来、、、
PS:这样的代码结构 能用在一些软件的远程维护上么??怎么提升质量? 本人小菜,求指点!!