读书人

Telnet服务端程序

发布时间: 2012-04-17 15:06:33 作者: rapoo

求助:Telnet服务端程序
自己写的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下运行等。。

[解决办法]
或者用 _popen
[解决办法]

C/C++ code
#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");   }}
[解决办法]
你这一个函数这么长。。。。
这么大批大批的重复的代码。。

你去把所有重复的都提取出来做成一个函数

读书人网 >VC/MFC

热点推荐