从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行,事情(有时)会正常进行,而其他时候,似乎什么也没有发生。最后,如果我使用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行。我知道这个代码还在完善中。但你肯定不想在做任何事情之前就回来吧?
最后,你正在使用异步通信,这可能是额外的复杂性,你现在可以不做。我建议你先同步做所有的事情,让它工作,然后切换到异步,如果你真的需要。
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 如何在boost beast http请求中设置http头
- 发送一个带有libcurl C++问题的帖子请求:s
- 在多个核心中处理一个HTTP请求
- 错误:请求非类类型为"MULTIMEDIA_FILME [500]"的成员|
- 使用 Winsock2.h C++向不和谐 API 发送 HTTP 请求时出现问题
- 每个服务器请求的内存预算
- 如何在 html 页面中插入 cgi 应用程序的输出?
- std::getline没有在while循环中重新请求用户输入
- 请求最简单的 OpenMP 目标 GPU 示例
- 请求有关C++中嵌入 for 循环的帮助
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 使用 winsock 接收 http 请求
- QNetworkAccessManager 稍后在添加请求时删除
- 为什么我收到来自谷歌的错误请求?
- 从网链套接字请求连接设备的列表
- Luci 无法启动请求的 CGI 程序:/www/cgi-bin/sample.cgi:执行错误
- 如何处理 CGI 中 POST 请求中的 0 内容长度
- 用AJAX请求从客户机终止用c++编写的长时间运行的CGI脚本
- 从c++程序发送CGI请求