我目前正致力于将我制作的原型产品集成到更大的程序中。我在原型中做的是在微控制器上创建一个HTTP服务器,然后编写一些HTML来在Web服务器上调用.cgi函数。这样我就可以通过以太网控制微控制器上的I/O。从C++程序发送CGI请求?
我的HTML看起来很简单的,叫上我曾与下面的语法是纽扣微控制器中的CGI功能:
<script type="text/javascript">
function my_confirm(a){
var r=confirm("Are you sure you'd like to run "+a+"?");
if (r==true)
location.href = a;
}
</script>
<button type = "button" onclick=" my_confirm('started.cgi')" >Started</button>
另外,如果我是键入“169.254.129.12/started。 cgi“转换为网页浏览器,微控制器会作出适当的响应。现在原型已经提前完成了,我的新任务是将我的控件集成到C++/CLI程序中。大。我从来没有用C++编写...
而不是重新做所有的后端的东西,我想添加一个菜单发送类似的请求。在过去的4-5天我已经得到在VS2005一个菜单并取得了有限的成功,用下面的代码:
int sendHttpRequestAndRespond(System::Uri^ url){
if(url->Scheme == System::Uri::UriSchemeHttp){
HttpWebRequest^ request = dynamic_cast<HttpWebRequest^>(WebRequest::Create(url));
request->Method = System::Net::WebRequestMethods::Http::Get;
return 0;
}
//HttpWebResponse^ response = dynamic_cast<HttpWebResponse^> (request->GetResponse());
//RequestState^ state = gcnew RequestState();
//state->request = request;
//try{
// IAsyncResult^ response = dynamic_cast<IAsyncResult^> (request->BeginGetResponse(gcnew AsyncCallback(responseReceived),state));
//}
//catch(WebException^ e){}
else
return -1;
}
随着写入的代码如上图(与存在的评论)的I/O控制微控制器不能正常工作。奇怪的是,如果我放入HttpWebResponse行,事情(有时)会正常进行,而其他时间则不会发生。最后,如果我使用AsyncResponse,如果使用HttpWebResponse部分,则情况类似。
现在我的想法/理解是,仅仅通过我在上面显示的代码中使用的GET方法输入请求就会启动单片机上的I/O控制,但似乎响应在其中扮演着一个角色,好。
你们有没有更好的方法去用这个?在这一点上,我非常困惑/沮丧,并愿意接受任何建议!谢谢你,
编辑1:更新后的代码:
int sendHttpRequestAndRespond(System::Uri^ url){
if(url->Scheme == System::Uri::UriSchemeHttp){
HttpWebRequest^ request = dynamic_cast<HttpWebRequest^>(WebRequest::Create(url));
request->Method = System::Net::WebRequestMethods::Http::Get;
RequestState^ state = gcnew RequestState();
state->request = request;
try{
IAsyncResult^ response = dynamic_cast<IAsyncResult^> (request->BeginGetResponse(gcnew AsyncCallback(responseReceived),state));
}
catch(WebException^ e){}
return 0;
}
有了这个代码,我得到了我的回调函数(responseReceived)前两次我调用函数,但从未在第三或进一步时间。我正在用http://www.facebook.com来测试这个,因为这似乎适用于我的CGI调用,但也只是前两次。 谢谢,
编辑2:解决方案和新问题! 好的,我发现我的问题主要是由于没有结束请求。在callBack函数中,我没有结束请求,HTTP协议有2个连接/ IP限制,使前两个调用工作,但未来的不会。
现在我的新问题是,在asyc调用我使用,它首先做同步DNS解析。由于我将这些命令发送到带IP的嵌入式计算机,因此很长一段时间内没有DNS和功能块。一旦我的电脑意识到存在DNS解析错误,它会以任何方式触发请求,并且它可以正常工作!随后的请求立即工作,因为有一个缓存可以记录失败。
所以即时约99%的方式,但我需要解决这个第一次锁定一些如何。我现在的想法是:
请求
前不知何故禁用DNS解析缩短从60多秒的DNS解析超时1ish秒
招我的comptuer /计算机程序运行在以为http://169.254.129.12有一个IP地址169.254.129.12(本地主机文件??)
我不知道如何完成这些,或者如果有更好的想法?
谢谢
有什么更好的点子吗?
感谢您的协助。现在的代码只是建立一个请求,但实际上并没有发送给服务器,这对我来说更有意义。如果我调用GetResponse(),它可以工作,但只有前两次。我想我可能没有正确地初始化... 至于异步/同步,在所有的现实中,我需要它是异步的(由于表单UI),并且似乎没有太多的复杂性增加。这是我目前的代码可以运行2次,但从来没有3+。 – fooOnYou
这可能是导致问题的异步代码。例如,我认为你必须在异步处理程序中调用EndGetResponse。也许你是因为不这样做而泄漏了连接?这就是为什么我建议你先同步执行,以确保你的基本通信是正确的,然后再添加异步复杂性。 (我会离开几天,所以我几天后将不能进一步回复,祝你好运!) –
我取得了一些进展!作品约99%,但由于beginGetResponse方法的复杂性,第一次需要很长时间。更多信息在上面张贴的编辑!可能会开始一个新的问题,因为这确实是一个新课题。谢谢Ciaran! – fooOnYou