社区
通信技术
帖子详情
高分紧急求助,关于网络通信和程序交互,高手请进!
lcn8575
2004-06-14 04:23:37
小弟正在编一个网络通信程序,遇到了好多问题无法解决,恳请各位大侠指点:
程序有以下几个要求:
1)一个基于局域网的网络协商程序;
2)要求既能实现广播通信,又能点对点通信;
3)更重要的是在接收到合适的数据以后,要启动其他的相关程序,如何将一个接收到字符串变成命令行的命令自动输入到另一个程序的交互式窗口中去?比如收到一个字符串为“connect”,怎样将变成另一个程序命令行的命令?
用什么方法?最好给个例子。
一定给分!!!
...全文
169
6
打赏
收藏
高分紧急求助,关于网络通信和程序交互,高手请进!
小弟正在编一个网络通信程序,遇到了好多问题无法解决,恳请各位大侠指点: 程序有以下几个要求: 1)一个基于局域网的网络协商程序; 2)要求既能实现广播通信,又能点对点通信; 3)更重要的是在接收到合适的数据以后,要启动其他的相关程序,如何将一个接收到字符串变成命令行的命令自动输入到另一个程序的交互式窗口中去?比如收到一个字符串为“connect”,怎样将变成另一个程序命令行的命令? 用什么方法?最好给个例子。 一定给分!!!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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()函数来将字符串解析成命令执行
SpringMVC入门学习(二)应用注解方式+注解优化
前篇已经介绍使用SpringMVC的方式进行环境搭建,以及一个简单的demo测试,下面我们再来介绍一下使用注解的方式,如何实现。 添加配置文件 springAnnotation-servlet.xml --> web.xml SpringMVC org.springframework.
【SpringMVC】| SpringMVC 入门
【SpringMVC】| SpringMVC 入门
SpringMVC学习(二)——快速搭建SpringMVC开发环境(注解方式)
文章目录说明1、工程搭建2、注解配置2.1、context:annotation-config说明2.2、context:component-scan配置说明2.3、mvc:annotation-driven配置说明3、简单代码实现4、文件上传下载实现4.1 文件上传jar包依赖4.2 在Spring中添加Bean配置4.3 文件上传实现4.4 文件下载实现5、拦截器配置5.1 拦截器代码实现5.......
【SpringMVC】JSON注解&全局异常处理机制
编码的过程中肯定遇到过显示到前端的数据必须是JSON格式和异常问题,了解JSON的注解让数据传输更为简便,并配合上全局异常处理,让你的项目更上一层楼。
通信技术
4,397
社区成员
28,909
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章