请教:如何实现如下功能?(50分)

  • 主题发起人 主题发起人 lhpgh
  • 开始时间 开始时间
L

lhpgh

Unregistered / Unconfirmed
GUEST, unregistred user!
有一台服务器,装的是UNIX系统,我想在WINDOWS2000上通过远程控件实现对其操作,在WINDOWS系统上输入UNIX命令就相当于在UNIX上输入此命令,并将UNIX上输入结果返回至WINDOS2000系统中,以便分析。

在实现这个功能之中,会用到哪些知识与控件呢?Telnet、WinSocked.......请各位高手赐教。因为我以前从来没有接触过这个方面的开发。但我看到过有人用PB开发这个系统已实现了这个功能,所以我想DELPHI一定也会实现的。
 
WinSocked可以,了
 
用telnet就是啦....
 
我有c的源码,delphi的用socket控件就可以了!
等一下,我的代码在linux分区中,
我还要换一下系统,
 
楼上的说得对!
 
有哪位能不能再详细说明一点,或给点源码学习学习也可以,谢了。
 
我把代码贴出来吧!!看对大家有没有用!!
服务器端程序:
/**********************************************************
* server.c
* 服务器端程序
*
*********************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

#define BUFSIZE 8192
#define DEFAULT_PORT 5320

enum{CMD_NAME,SRC_PORT};

int execute(char *command,char *buf,int bufmax);

int main(int argc,char *argv[])
{
struct sockaddr_in server; //服务器地址
struct sockaddr_in client; //客户机地址
int len; //sockaddr_in的长度
int port; //服务器端口号
int s; //接收报文用描述符
int s0; //接收连接用描述符
int cn; //接收命令的字数
int sn; //发送报文的字节数
int rn; //接收报文的字节数
char cmd1[BUFSIZE]; //第一个语句命令
char cmd2[BUFSIZE]; //第二个语句命令
char recv_buf[BUFSIZE]; //接收缓冲区
char send_buf[BUFSIZE]; //发送缓冲区

//实际参数的处理(端口号)
if(argc==2){
if((port=atoi(argv[SRC_PORT]))==0){
struct servent *se; //服务信息

if((se=getservbyname(argv[SRC_PORT],"tcp"))!=NULL)
port=(int) ntohs((u_short)se->s_port);
else{
fprintf(stderr,"getservbyname error/n");
exit(EXIT_FAILURE);
}
}
}else
port=DEFAULT_PORT;

//使用TCP协议打开一个套接字
if((s0=socket(AF_INET,SOCK_STREAM,0))<0){
perror("socket");
exit(EXIT_FAILURE);
}

//设定服务器地址
memset((char *)&amp;server,0,sizeof(server));
server.sin_family=AF_INET;
server.sin_addr.s_addr=htonl(INADDR_ANY);
server.sin_port=htons(port);
if(bind(s0,(struct sockaddr *)&amp;server,sizeof(server))<0){
perror("bind");
exit(EXIT_FAILURE);
}

//开始接受建立连接请求
listen(s0,5);

//接收连接循环
while(1){
//接收连接处理
len=sizeof(client);
if((s=accept(s0,(struct sockaddr *)&amp;client,&amp;len))<0){
perror("accept");
exit(EXIT_FAILURE);
}
printf("Connected From '%s'/n",inet_ntoa(client.sin_addr));

#ifdef FORK_SERVER
if(fork()!=0){
close(s);
continue;
}
close(s0);
#endif
//服务器处理的主要子程序
while(1){
int i=0; //接收字符的计数器

sn=sprintf(send_buf,"TCP>");
send(s,send_buf,sn,0);

receive: //流型数据的接收处理
if((rn=recv(s,&amp;recv_buf,1,0))<0)
break;

//以换行为单位进行接收处理
if(recv_buf!='/n'){
i++;
if(i<BUFSIZE-1)
goto receive;
}
recv_buf='/0';
printf("receive '%s'/n",recv_buf);

//接收命令的处理
if((cn=sscanf(recv_buf,"%s%s",cmd1,cmd2))<=0)
continue;
else if(cn==2 &amp;&amp; strcmp(cmd1,"show")==0){
if(strcmp(cmd2,"route")==0)
#ifdef _linux
sn=execute("/usr/bin/netstat -rn",send_buf,BUFSIZE);
#else
sn=execute("/bin/netstat -rn",send_buf,BUFSIZE);
#endif
else if(strcmp(cmd2,"arp")==0)
#ifdef _linux
sn=execute("/usr/sbin/arp -an",send_buf,BUFSIZE);
#else
sn=execute("/sbin/arp -an",send_buf,BUFSIZE);
#endif
else if(strcmp(cmd2,"tcp")==0)
#ifdef _linux
sn=execute("/usr/bin/netstat -tn",send_buf,BUFSIZE);
#else
sn=execute("/bin/netstat -tn",send_buf,BUFSIZE);
#endif
else if(strcmp(cmd2,"nic")==0)
sn=execute("/sbin/ifconfig -a",send_buf,BUFSIZE);
else
sn=sprintf(send_buf,"parameter error '%s'/n"
"show[route|arp|tcp|nic]/n",cmd2);
}else if(cn==1){
if(strcmp(cmd1,"quit")==0)
break;
send_buf[0]='/0';
if(strcmp(cmd1,"help")!=0)
sprintf(send_buf,"command error '%s'/n",cmd1);
strcat(send_buf,"command:/n"
"show route/n"
"show arp/n"
"show tcp/n"
"show nic/n"
"quit/n"
"help/n");
sn=strlen(send_buf);
}else
sn=sprintf(send_buf,"command error '%s'/n",cmd1);
if(sn==0)
sn=sprintf(send_buf,"/n");

if(send(s,send_buf,sn,0)<0)
break;
printf("%s",send_buf);
}
printf("Connection closed./n");
close(s);
}
close(s0);

return EXIT_SUCCESS;
}

/*
*int execute(char *command,char *buf,int bufmax);
*
*功能
* 执行命令,将结果存储到缓冲区中
*实际参数
* char *command; 所执行的命令
* char *buf; 存储输出结果的缓冲区
* int bufmax 缓冲区的大小
*返回值
* int 存储到缓冲区的字符数
*/
int execute(char *command,char *buf,int bufmax)
{
FILE *fp; //文件指针
int i; //输入数据的字节数

if((fp=popen(command,"r"))==NULL){
perror(command);
i=sprintf(buf,"server error: '%s' cannot execute./n",command);
}else{
i=0;
while((buf=fgetc(fp))!=EOF &amp;&amp; i<bufmax-1)
i++;

pclose(fp);
}
return i;
}

以下是客户端程序!
/***************************************************
* client.c
* 在Red Hat 9.0 GCC下调试通过!
* 在运行服务器端程序之后,
* 再运行客户端,否则,连接会失败!
* ./client 你的ip地址 [端口]
* 呵呵!!
* GoodLuck
***************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/socket.h>
#include<sys/time.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>

#define BUFSIZE 8192
#define DEFAULT_PORT 5320

enum {SMD_NAME,DST_IP,DST_PORT};

int main(int argc,char *argv[])
{
struct sockaddr_in server; //服务器地址
unsigned long dst_ip; //服务器IP地址
int port; //端口号
int s; //套接字的描述符
int n; //输入数据的字节数
char buf[BUFSIZE]; //接收缓
char cmd[BUFSIZE]; //发送缓
struct timeval tv; //select超时时间
fd_set readfd; //使用select检索出的描述符

//实际参数的检查
if(argc!=2 &amp;&amp; argc!=3){
fprintf(stderr,"Usage: %s hostname[port]/n",argv[0]);
exit(EXIT_FAILURE);
}

//检索服务器的ip地址
if((dst_ip=inet_addr(argv[DST_IP]))==INADDR_NONE){
struct hostent *he; //主机信息

if((he=gethostbyname(argv[DST_IP]))==NULL){
fprintf(stderr,"gethostbyname error/n");
exit(EXIT_FAILURE);
}
memcpy((char *)&amp;dst_ip,(char *)he->h_addr,sizeof(he->h_addr));
}

//检索服务器的端口号
if(argc==3){
if((port=atoi(argv[DST_PORT]))==0){
struct servent * se; //服务信息

if((se=getservbyname(argv[DST_PORT],"tcp"))!=NULL)
port=(int) ntohs((u_short)se->s_port);
else{
fprintf(stderr,"getservbyname error/n");
exit(EXIT_FAILURE);
}
}
}else
port=DEFAULT_PORT;

//使用TCP协议打开一个套接字
if((s=socket(AF_INET,SOCK_STREAM,0))<0){
perror("socket");
exit(EXIT_FAILURE);
}

//设定服务器的地址,建立一个连接
memset((char *)&amp;server,0,sizeof(server));
server.sin_family=AF_INET;
server.sin_addr.s_addr=dst_ip;
server.sin_port=htons(port);
if(connect(s,(struct sockaddr *)&amp;server,sizeof(server))<0){
perror("connect");
exit(EXIT_FAILURE);
}

printf("Connected to '%s'/n",inet_ntoa(server.sin_addr));

//客户机处理的主要子程序
while(1){
//select超时的设定
tv.tv_sec=600;
tv.tv_usec=0;

//标准输入,有无来自服务器的报文
FD_ZERO(&amp;readfd);
FD_SET(0,&amp;readfd);
FD_SET(s,&amp;readfd);
if((select(s+1,&amp;readfd,NULL,NULL,&amp;tv))<=0){
fprintf(stderr,"/nTimeout/n");
break;
}

//标准输入
if(FD_ISSET(0,&amp;readfd)){
if((n=read(0,buf,BUFSIZE-1))<=0)
break;
buf[n]='/n';
sscanf(buf,"%s",cmd);
if(strcmp(cmd,"quit")==0)
break;
if(send(s,buf,n,0)<=0)
break;
}

//服务器
if(FD_ISSET(s,&amp;readfd)){
if((n=recv(s,buf,BUFSIZE-1,0))<=0){
fprintf(stderr,"connection closed./n");
exit(EXIT_FAILURE);
}
buf[n]='/0';
printf("%s",buf);
fflush(stdout);
}
}

strcpy(buf,"quit");
send(s,buf,n,0);
close(s);

return EXIT_SUCCESS;
}
 
楼上兄弟,谢谢你的源码,不过我没有搞过C的,还好,看得懂一些。
你的意思是还要在服务器(UNIX机)上放一个服务程序的吗?

能不能不动UNIX机子,只是在WINDOWS2000机子上运行即可操作呢?
 
谢谢各位了,我在DELPHI的MEMOS中找到了一个实例就可以正常运行了
 
后退
顶部