• 全部
  • 问答

高分紧急求助,关于网络通信和程序交互,高手请进!

lcn8575 华为 架构师  2004-06-14 04:23:37
小弟正在编一个网络通信程序,遇到了好多问题无法解决,恳请各位大侠指点:

程序有以下几个要求:
1)一个基于局域网的网络协商程序;
2)要求既能实现广播通信,又能点对点通信;
3)更重要的是在接收到合适的数据以后,要启动其他的相关程序,如何将一个接收到字符串变成命令行的命令自动输入到另一个程序的交互式窗口中去?比如收到一个字符串为“connect”,怎样将变成另一个程序命令行的命令?

用什么方法?最好给个例子。
一定给分!!!
...全文
104 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
awjx 2004-06-17
楼主是谁呀?
怎么与我做一样的
回复
gracezhu 2004-06-15
http://www.pcvc.net/category/content.asp?sendid=261
回复
lcn8575 2004-06-14
to netsys2:
谢谢你的回答!
不过这是个BC的程序吧?
我对BC不是很熟,还是希望能看到个VC的程序代码.
谢谢了!
回复
netsys2 2004-06-14
1),2)查看CB或者DELPHI中CHAT程序

3)

Easy,

用管道。


http://www.chinabcb.com/bbs/viewtopic.php?t=5113&highlight=%B9%DC%B5%C0
★使用管道技术实例
代码:
bool __fastcall TForm1::RunCmd(AnsiString cmd,TStringList *stringlist)
{
TMemoryStream *memstream=new TMemoryStream();
AnsiString rn="\\r\\n";
PROCESS_INFORMATION proc;
STARTUPINFO start;
SECURITY_ATTRIBUTES sa;
long ret;
unsigned long lngBytesread;
HANDLE hReadPipe,hWritePipe;
char *strBuff=(char *)malloc(256);
if(strBuff==NULL)
{
return false;
}
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle=true;
sa.lpSecurityDescriptor=NULL;
ret=CreatePipe(&hReadPipe,&hWritePipe,&sa,0);
if(ret==0)
{
//创建管道失败
return false;
}
memset(&start,0x00,sizeof(STARTUPINFO));
start.cb=sizeof(STARTUPINFO);
start.dwFlags=STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
start.hStdOutput=hWritePipe;
start.hStdError=hWritePipe;
bool retc=CreateProcess(NULL,cmd.c_str(),NULL,NULL,true, 0, 0, NULL, &start, &proc);
if(!retc)
{
return false;
}
CloseHandle(hWritePipe);
unsigned long len;
memstream->Position=0;
while(true)
{
memset(strBuff,0x00,256);
GetFileSize(hReadPipe,&len);
ret = ReadFile(hReadPipe, strBuff, 256, &lngBytesread,NULL);
if(ret==0)
{
break;
}
else
{
memstream->Write(strBuff,lngBytesread);
}
}
CloseHandle(proc.hProcess);
CloseHandle(proc.hThread);
CloseHandle(hReadPipe);
memstream->Position=0;
free(strBuff);
stringlist->LoadFromStream(memstream);
memstream->Clear();
delete memstream;
return true;
}


以上为一个使用管道获取命令行模式的程序的运行结果的函数。

使用代码

TStringList *StrList=new TStringList;
AnsiString strcmd;

RunCmd(strcmd,StrList);

结果保留再StrList中。
试了试,发现上述代码运行时不能显示中间过程,要等到程序完全运行结束才能看到结果,不太方便(特别是运行比较耗时的命令)。并且会多出一些不必要的空行,和dos窗口下看到的结果不一样(例如运行ping的命令)。

下面是我改进的代码,把运行的情况直接显示在Memo1中。其实我觉得没有太大的必要使用TMemoryStream,直接用AnsiString就可以了。
代码:

//---------------------------------------------------------------------------
String __fastcall TForm1::ExecuteApp(String sCmdline)
{
PROCESS_INFORMATION proc = {0};
long ret,k=1;
bool bret;
STARTUPINFO start = {0};
SECURITY_ATTRIBUTES sa = {0};
HANDLE hReadPipe ;
HANDLE hWritePipe;
String sOutput;
String sBuffer;
unsigned long lngBytesRead;
char cBuffer[257];
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor=0;
sa.bInheritHandle = TRUE;
bret =::CreatePipe(&hReadPipe, &hWritePipe,&sa, 0);
if (!bret)
{
sOutput="CreatePipe failed. Error: " + String(GetLastError());
Memo1->Lines->Add(sOutput);
return sOutput;
}
start.cb = sizeof(STARTUPINFOA);
start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
start.hStdOutput = hWritePipe;
start.hStdError = hWritePipe;
start.wShowWindow = SW_HIDE;
sBuffer = sCmdline;
ret =::CreateProcess(0, sBuffer.c_str(), &sa, &sa, TRUE, NORMAL_PRIORITY_CLASS, 0, 0, &start, &proc);
if (ret == 0)
{
sOutput="Bad command or filename";
Memo1->Lines->Add(sOutput);
return sOutput;
}
::CloseHandle(hWritePipe);
do
{
memset(cBuffer,'\0',sizeof(cBuffer));
ret = ::ReadFile(hReadPipe, &cBuffer, 256, &lngBytesRead, 0);
sBuffer=StrPas(cBuffer);
sOutput = sOutput + sBuffer;
Memo1->Text=Memo1->Text+sBuffer;
Application->ProcessMessages();

} while (ret != 0 );
::CloseHandle(proc.hProcess);
::CloseHandle(proc.hThread);
::CloseHandle(hReadPipe);
return sOutput;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ExecuteApp("Ping www.chinabcb.com");
}
//---------------------------------------------------------------------------






回复
netsys2 2004-06-14
system(应该用WINEXEC)是执行一条命令或者程序。

如果要把命令自动输入到另一个程序的交互式窗口,必须用管道,消息。。
回复
cai3995 2004-06-14
你可以用system()函数来将字符串解析成命令执行
回复
相关推荐
发帖
通信技术
创建于2007-08-27

4056

社区成员

通信技术相关讨论
申请成为版主
帖子事件
创建了帖子
2004-06-14 04:23
社区公告
暂无公告