繁体   English   中英

从C ++程序发送CGI请求?

[英]Send CGI request from C++ program?

我目前正在将我制作的原型产品集成到更大的程序中。 我在原型中所做的就是在微控制器上创建HTTP服务器,然后编写一些HTML来调用Web服务器上的.cgi函数。 这样我就可以通过以太网控制微控制器上的I / O。

我的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>

另外,如果我要在Web浏览器中键入“ 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),但从未在第3次或以后。 我正在使用http://www.facebook.com对此进行测试,因为这似乎适用于我的CGI调用,但也仅适用于前两次。 谢谢,

编辑2:解决方案和新问题! 好的,我发现我的问题主要是由于未结束请求。 在callBack函数中,我没有结束请求,并且HTTP协议具有2个连接/ ip限制,这使得前两个调用可以工作,但以后的调用则不能。

现在我的新问题是,在我使用的asyc调用中,它首先执行同步DNS解析。 由于我将这些命令发送到具有IP的嵌入式计算机,因此它们之间没有DNS,并且该功能长时间处于阻塞状态。 一旦我的计算机意识到存在DNS解析错误,它将以任何方式触发该请求,并且可以正常工作! 后续请求可立即工作,因为有一个可以记住故障的缓存。

因此,即时通讯大约有99%的方式在那里,但是我需要以某种方式来修复此首次锁定。 我目前的想法是:

在请求之前以某种方式禁用DNS解析

将dns解析超时从60+秒缩短到1ish秒

欺骗我的计算机/程序运行的计算机,以为http://169.254.129.12的ip地址为169.254.129.12(本地主机文件?)。

我不确定如何实现这些目标,或者不确定是否有更好的主意?

谢谢,

还有更好的主意吗?

我对HttpWebRequest类和相关类不是很熟悉,但是据我所知,直到您(a)通过写入请求流显式发送它,或(b)检索到请求,请求才被发送到服务器通过调用GetResponse来响应。 所以对于初学者来说,我认为您需要取消所有这些注释。

我想知道为什么您在对请求执行任何操作之前先返回第5行。 我知道这段代码正在进行中。 但是,您确定不想在做任何事情之前返回吗?

最后,您使用的是异步通讯,这可能是额外的复杂性,您可以立即执行此操作。 我建议您首先同步完成所有工作,然后再根据需要切换到异步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM