从c++程序发送CGI请求

Send CGI request from C++ program?

本文关键字:CGI 请求 c++ 程序      更新时间:2023-10-16

我目前正在将我制作的原型产品集成到一个更大的程序中。我在原型中所做的是在微控制器上创建一个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行,事情(有时)会正常进行,而其他时候,似乎什么也没有发生。最后,如果我使用asynresponse,情况与使用HttpWebResponse部分类似。

现在我的想法/理解是,仅仅通过我在上面所示的代码中使用的GET方法输入请求,就会启动微控制器上的I/O控制,但似乎响应也在其中起作用。

你们有更好的方法吗?在这一点上,我非常困惑/沮丧,并愿意接受任何建议!谢谢你,

EDIT 1: UPDATED CODE:

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;
    }

使用这段代码,我在前两次调用函数时进入回调函数(responserreceived),但从未在第三次或以后的时间。我正在用http://www.facebook.com进行测试,因为这似乎适用于我的CGI调用,但也只有前两次。谢谢你,

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

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

所以我大约99%的方式,但我需要解决这个第一次锁定。我现在的想法是:

在请求前禁用dns解析

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

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

我不确定如何完成这些,或者是否有更好的想法??

谢谢你,

有更好的主意吗?

我对HttpWebRequest类和相关类不是很熟悉,但据我所知,请求不会发送到服务器,直到您(a)通过写入请求流显式地发送它,或者(b)通过调用GetResponse检索响应。首先,我认为你需要取消注释。

我想知道为什么您在对请求做任何事情之前返回第5行。我知道这个代码还在完善中。但你肯定不想在做任何事情之前就回来吧?

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