2016-03-21 13 views
0

webclientからJavaScriptまたはJQuery経由でDebian JessieのApache2 Webサーバにメッセージを送信しようとしましたが、POSIX message_queueを送信するコンパイル済みCプログラムを実行しましたが、それを働かせることはできません。JavaScriptまたはJQueryからサーバ側のcgiコードを実行する際に問題が発生しました

私は私のCGIディレクトリに以下のファイルがあります。 ルートの@ ASUS:は/ var/www /のCGI-binに#1のls -l -rwxr-XR-X 1 WWW-データWWW-データ59008 3月20日17: 47 mq_client.cgi -rwxr-xr-x 1 www-data www-data 115 3月17日18:14 test.pl

mq_client.cgiは、POSIXメッセージを生成するCコンパイルされた実行可能ファイルです。 lachlan @ asus:〜$ /var/www/cgi-bin/mq_client.cgi を実行すると、サーバーによって正しいメッセージが送受信されます。

Test.plは、HTMLコードを生成するperl SCRPTであると私は ラクランする@ ASUSを実行している場合:〜これも正常に動作し、出力を与える$ /var/www/cgi-bin/test.pl : コンテンツ-type:text/html テストするだけです。私はクロムWebサーバを使用する場合は

次のように: http://localhost/cgi-bin/test.pl 私は、正しい結果を得る:「ただ、テスト」

しかし、私は、ウェブサーバから実行するmq_client.cgiコードを取得することができていません。私は多くのウェブサイトを検索し、以下に示すように多くのオプションを試しました。

これは私のコードである「のindex.html」である

<!DOCTYPE html> 
<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <script type="text/javascript" src="js/jq_182.js"></script> 
    <script type="text/javascript"> 

    function mapToggle(){ 
     // different options as indicated below 
     } 
    </script> 
    </head> 
    <body> 
     <div id = "label"> </div> 
     <form action = "" class = "mapButton"> 
      <p> <button type= "button" onclick = "mapToggle()" class = "button2property"> Map Toggle </button> </p>   
      </form> 
    </body> 
</html> 

上記に示した位置に私が試みた異なるオプション(一つずつ)(Iボタンを押したときのみに発生したエラーに注意) :

//オプション1

var site = 22;   
$.ajax({type: "PUT", url: "/cgi-bin/mq_client.cgi", async: false, data: site}); 

これはクロムで、次の2つのエラーを与える:メインスレッド上 同期XMLHttpRequestがDEPですエンドユーザの経験に有害な影響を及ぼすために記載されています。詳細についてはhttps://xhr.spec.whatwg.org/をご確認ください。 jq_182.js:2 PUT http://localhost/cgi-bin/mq_client.cgi 500(内部サーバーエラー)

//オプション2

var site = 22;   
$.ajax({type: "GET", url: "/cgi-bin/mq_client.cgi", async: false, data: site}); 

これは、次の2つのエラーを与える:メインスレッド上 同期のXMLHttpRequestは、そのにより廃止されましたエンドユーザーの経験に有害な影響を与えます。詳細についてはhttps://xhr.spec.whatwg.org/をご確認ください。 jq_182.js: index2.html:21 GET http://localhost/cgi-bin/mq_client.cgi 500(内部サーバー2 はhttp://localhost/cgi-bin/mq_client.cgi 500(内部サーバーエラー)をGET

//オプション3.

var myRequest = new XMLHttpRequest(); 
myRequest.open("GET", "/cgi-bin/mq_client.cgi"); 
myRequest.send(); 

これは、次のエラーコードを示しますエラー)

//オプション4

src = "/cgi-bin/mq_client.cgi"; 

エラーなし

はクロムで示されているが、何のメッセージもありません

//オプション5.

var img = new Image(); 
img.src = "/cgi-bin/mq_client.cgi"; 

生じる誤差送ら:GETをhttp://localhost/cgi-bin/mq_client.cgi 500(内部サーバーエラー)

//オプション6.また、ファイル名をindex.shtmlに変更しました

<!--#exec cmd="/cgi-bin/mq_client.cgi" --> 

エラーがクロムで示されていないが、メッセージがないされているが、

//オプション7.

var client = new XMLHttpRequest(); 
client.open("post", "/cgi-bin/mq_client.cgi", true);  

を送られたエラーはクロムに示されていないが、送信されたメッセージはありませんされています。

//オプション8.

var client = new XMLHttpRequest(); 
var formx = new FormData(); 
formx.append("dummy","data"); 
client.open("post", "/cgi-bin/mq_client.cgi", true);  
client.setRequestHeader("Content-Type", "multipart/form-data"); 
client.send(formx);  

エラー:index2.html:45 POST http://localhost/cgi-bin/mq_client.cgi 500(内部サーバーエラー)

私は多くの参照を検討し、彼らの提案を試してみましたが、まだ解決していないしています問題。

問題がどこで見つかるかについてのご意見をいただければ幸いです。 Lachlan

サーバーサイドコードは、POSIXメッセージキューを生成します。 サーバーコードは、POSIXメッセージをサーバーに送信します。コードは以下の通りである:ここで

int main(void) { 
    char msg[5]; 

    // Open queue already created 
    mqd_t mQueue = mq_open("q1", O_WRONLY, NULL); 
    if (mQueue == (mqd_t) -1){ 
     puts("Queue Open Failed\n"); 
     return EXIT_FAILURE; 
     } 
    puts("Queue Opened\n"); 

    // Send Message 
    msg[0] = 22; 
    if (mq_send(mQueue, msg, 5, 1) == -1){ 
      puts("Queue Send Failure\n"); 
      return EXIT_FAILURE; 
      } 
    puts("Message Sent\n"); 
    mq_close(mQueue); 
    return EXIT_SUCCESS; 
} 

は、メッセージキューを受信するサーバーのコードです:

int main(void) { 
    char msg[MAX_MSG_SIZE]; 
    unsigned int prio; 
    ssize_t msgLength = 0; 

    // Create queue 
    struct mq_attr attr; 
    attr.mq_maxmsg = 4; 
    attr.mq_msgsize = 5;    
    mQueue = mq_open(“q1”, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO, &attr); 
    if (mQueue == (mqd_t) -1){ 
     puts("Queue Create Failed\n"); 
     return EXIT_FAILURE; 
     } 
    puts("Queue Created\n"); 

    // get message - This blocks 
    msgLength = mq_receive(mQueue, msg, MAX_MSG_SIZE, &prio); 
    if (msgLength == -1){ 
     puts("Queue Read Failure\n"); 
     return EXIT_FAILURE; 
     } 

    printf("Message Received: %i\n", (int)msg[0]); 
    mq_close(mQueue); 
    return EXIT_SUCCESS; 
} 

サーバーのキューにアクセスするための権限は以下のとおりです。 S_IRWXU | S_IRWXG | S_IRWXO

CGIのコードを実行するための権限は次のとおりです。 -rwxr-XR-X 1 WWW-データWWW-データ59008 3月20日17時47分mq_client.cgi

これは、アクセス権の問題である場合は、提案することができますどのアクセス許可が欠落していますか?

+0

すべての例は、(a)結果を報告しない、または(b)結果を内部サーバーエラーとして報告します。サーバーエラーの詳細を調べるには、サーバーログを読み取る必要があります(さらに、サーバー側のコードにデバッグを追加する必要があります)。サーバーがエラーを投げている理由を理解せずに要求にバリエーションを加えることは、デバッグには非常に貧弱なアプローチです。 – Quentin

+0

サーバーコードは、POSIXメッセージをサーバーに送信します。コードは次のとおりです。 int main(void){ \t mqd_t mQueue; \t char msg [5]; \t //すでに作成されたメッセージキューを開く \t mQueue = mq_open(mQname、O_WRONLY、NULL); \t(mqueueを==(mqd_t)-1){ \t \tプット( "メッセージキューを開くがn \失敗")であれば、 \t \t return EXIT_FAILURE; \t \t} \tプット( "メッセージキューは、n \オープン")。 \t //メッセージを送信 \t msg [0] = 22; \t if(mq_send(mQueue、msg、5、1)== -1){ \t \t \t puts( "Message Queue Send Failure \ n"); \t \t \t return EXIT_FAILURE; \t \t \t} \tプット( "メッセージ送信の\ n"); \t puts( "Message Queue Closed \ n"); \t mq_close(mQueue); \t戻り値EXIT_SUCCESS; } – lachlan

+0

サーバーコードは、サーバーにPOSIXメッセージを送信します。コードは次のとおりです。 int main(void){ \t char msg [5]; \t //未処理のキューが既に作成されている \t mqd_t mQueue = mq_open( "q1"、O_WRONLY、NULL); \t(mqueueを==(mqd_t)-1){ \t \tプット( "キューを開くがn \失敗")であれば、 \t \t return EXIT_FAILURE; \t \t} \tプット( "キューオープンする\ n"); \t //メッセージを送信 \t msg [0] = 22; \t(mq_send(mqueueを、MSG、5、1)== -1){ \t \t \tプット( "キューが障害\ nを送信する")場合。 \t \t \t return EXIT_FAILURE; \t \t \t} \tプット( "メッセージ送信の\ n"); \t mq_close(mQueue); \t戻り値EXIT_SUCCESS; } – lachlan

答えて

0

最終的に問題を解決するのに役立つ別の投稿が見つかりました。はい、権限の問題でした。プログラムのアクセス許可がメッセージキューのアクセス許可をオーバーライドしていました。これが解決されると、問題は解決されました。 よろしくお願いいたします。 Lachlan

関連する問題