我目前正致力於將我製作的原型產品集成到更大的程序中。我在原型中做的是在微控制器上創建一個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