2011-08-17 191 views
0

我目前正致力于将我制作的原型产品集成到更大的程序中。我在原型中做的是在微控制器上创建一个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(本地主机文件??)

我不知道如何完成这些,或者如果有更好的想法?

谢谢

有什么更好的点子吗?

回答

0

我不是很熟悉HttpWebRequest类和相关的类,但据我所知,请求不会被发送到服务器,直到(a)通过写入请求流来明确地发送它,或者(b)通过调用GetResponse来获取响应。所以对于初学者,我认为你需要取消所有这些东西的评论。

我不知道为什么你在做任何事情之前回到第5行。我知道这段代码是一项正在进行中的工作。但是,在做任何事之前,你肯定不想回来?

最后,您使用的是异步通信,这可能是额外的复杂性,您现在可以不做。我建议你先做所有事情,先让它工作,然后再切换到异步,如果你真的需要的话。

+0

感谢您的协助。现在的代码只是建立一个请求,但实际上并没有发送给服务器,这对我来说更有意义。如果我调用GetResponse(),它可以工作,但只有前两次。我想我可能没有正确地初始化... 至于异步/同步,在所有的现实中,我需要它是异步的(由于表单UI),并且似乎没有太多的复杂性增加。这是我目前的代码可以运行2次,但从来没有3+。 – fooOnYou

+0

这可能是导致问题的异步代码。例如,我认为你必须在异步处理程序中调用EndGetResponse。也许你是因为不这样做而泄漏了连接?这就是为什么我建议你先同步执行,以确保你的基本通信是正确的,然后再添加异步复杂性。 (我会离开几天,所以我几天后将不能进一步回复,祝你好运!) –

+0

我取得了一些进展!作品约99%,但由于beginGetResponse方法的复杂性,第一次需要很长时间。更多信息在上面张贴的编辑!可能会开始一个新的问题,因为这确实是一个新课题。谢谢Ciaran! – fooOnYou