社区
通信技术
帖子详情
高分紧急求助,关于网络通信和程序交互,高手请进!
lcn8575
2004-06-14 04:23:37
小弟正在编一个网络通信程序,遇到了好多问题无法解决,恳请各位大侠指点:
程序有以下几个要求:
1)一个基于局域网的网络协商程序;
2)要求既能实现广播通信,又能点对点通信;
3)更重要的是在接收到合适的数据以后,要启动其他的相关程序,如何将一个接收到字符串变成命令行的命令自动输入到另一个程序的交互式窗口中去?比如收到一个字符串为“connect”,怎样将变成另一个程序命令行的命令?
用什么方法?最好给个例子。
一定给分!!!
...全文
136
6
打赏
收藏
高分紧急求助,关于网络通信和程序交互,高手请进!
小弟正在编一个网络通信程序,遇到了好多问题无法解决,恳请各位大侠指点: 程序有以下几个要求: 1)一个基于局域网的网络协商程序; 2)要求既能实现广播通信,又能点对点通信; 3)更重要的是在接收到合适的数据以后,要启动其他的相关程序,如何将一个接收到字符串变成命令行的命令自动输入到另一个程序的交互式窗口中去?比如收到一个字符串为“connect”,怎样将变成另一个程序命令行的命令? 用什么方法?最好给个例子。 一定给分!!!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
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()函数来将字符串解析成命令执行
TowardsDataScience 博客中文翻译 2019(四百八十二)
这篇文章讨论了数据科学和机器学习中一个基本算法的基本构建模块:线性回归。...如果你想了解更多,请查看本系列关于逻辑回归的下一篇文章!我希望你觉得这篇文章很有用,并且像往常一样,欢迎在评论中发表意见!
ACloudGuru 博客中文翻译(二)
专业的云开发人员了解云原生软件设计的原则,并且能够使用可伸缩性、可靠性和安全性的最佳实践来构建、测试和部署应用
程序
。对于使用谷歌云平台的开发人员来说,专业云开发人员认证证明你处于云原生开发的前沿,并将...
最详细的手机资料名词术语解释
关于网络频率,请看多普达900和诺基亚N70的介绍,有提及的频率就表示这台机支持这个功能~ <br /> 多普达900的网络频率: GSM/GPRS/WCDMA;900/1800/1900/2100MHz <br /> 诺基亚N70的网络频率:...
社会工程学习手册(一)
这本书涵盖的主题从诱饵,网络钓鱼,鱼叉式网络钓鱼,到伪装和恐吓软件。到本书结束时,你将有能力保护自己和你的系统免受社会工程的威胁和攻击。总而言之,这本书从头到尾涵盖了社会工程,并摘录了许多世界知名的...
计算机网络随笔
《计算机网络》笔记 七层体系 五层体系 TCP/IP四层体系 应用层 应用层 应用层(如ssh协议、tftp协议、smtp协议等) 表示层 会话层 运输层 运输层 运输层(TCP、UDP) ...
通信技术
4,387
社区成员
28,918
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章