2011-08-17 198 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