我想通過JavaScript或JQuery將消息從webclient發送到Debian Jessie上的Apache2 web服務器,以執行發送POSIX message_queue的已編譯C程序,但是我不能讓它工作。從javascript或JQuery執行服務器端cgi代碼時出現問題
我有我的CGI目錄下面的文件: 根@華碩:在/ var/WWW/cgi-bin目錄#ls -l命令 -rwxr-XR-X 1 www數據www數據59008 17年3月20日: 47 mq_client.cgi -rwxr-xr-x 1 www-data www-data 115 Mar 17 18:14 test.pl
mq_client.cgi是生成POSIX消息的C編譯可執行文件。如果我執行 lachlan @ asus:〜$ /var/www/cgi-bin/mq_client.cgi 正確的消息由服務器發送和接收。
Test.pl是一個perl SCRPT生成的HTML代碼,如果我執行 拉克倫@華碩:〜$ /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>
中的位置上面指出我已經嘗試了不同的選項(一一) :
//選項1.
var site = 22;
$.ajax({type: "PUT", url: "/cgi-bin/mq_client.cgi", async: false, data: site});
這使得在Chromium以下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:2 GET http://localhost/cgi-bin/mq_client.cgi 500(內部服務器錯誤)
//選項3
var myRequest = new XMLHttpRequest();
myRequest.open("GET", "/cgi-bin/mq_client.cgi");
myRequest.send();
這提供了以下錯誤代碼: index2.html:21 GET http://localhost/cgi-bin/mq_client.cgi 500(內部服務器錯誤)
//選項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(內部服務器錯誤)
// option 6.同時將文件名改爲index.shtml
<!--#exec cmd="/cgi-bin/mq_client.cgi" -->
沒有錯誤在Chromium表示,但沒有消息發送
//選項7.
var client = new XMLHttpRequest();
client.open("post", "/cgi-bin/mq_client.cgi", true);
沒有錯誤在Chromium表示,但沒有發送的消息。
//選項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
如果這是一個權限問題,你可以建議哪些權限缺失?
所有示例(a)不報告結果或(b)將結果報告爲內部服務器錯誤。您需要閱讀服務器日誌(並且可能會向您的服務器端代碼添加更多調試)以查找服務器錯誤的詳細信息。在不瞭解服務器爲什麼拋出錯誤的情況下對請求進行修改是非常糟糕的調試方法。 – Quentin
服務器代碼向服務器發送POSIX消息。代碼如下: int main(void){ \t mqd_t mQueue; \t char msg [5]; \t //打開已創建的消息隊列 \t mQueue = mq_open(mQname,O_WRONLY,NULL); (mQueue ==(mqd_t)-1){ \t puts(「Message Queue Open Failed \ n」);如果(mQueue ==(mqd_t)-1){ \t \t puts \t \t return EXIT_FAILURE; \t \t} \t puts(「Message Queue Opened \ n」); \t //發送消息 \t msg [0] = 22;如果(mq_send(mQueue,msg,5,1)== -1){ } \t puts(「Message Queue Send Failure \ n」); \t \t \t return EXIT_FAILURE; (「Message Sent \ n」); \t puts(「Message Queue Closed \ n」); \t mq_close(mQueue); \t return EXIT_SUCCESS; } – lachlan
服務器代碼發送一個POSIX消息給服務器。代碼如下: int main(void){ \t char msg [5]; \t //已創建開放隊列 \t mqd_t mQueue = mq_open(「q1」,O_WRONLY,NULL); (mQueue ==(mqd_t)-1){ \t puts(「Queue Open Failed \ n」); \t \t return EXIT_FAILURE; \t \t} \t puts(「Queue Opened \ n」); \t //發送消息 \t msg [0] = 22;如果(mq_send(mQueue,msg,5,1)== -1){ } \t puts(「Queue Send Failure \ n」); \t \t \t return EXIT_FAILURE; (「Message Sent \ n」); \t mq_close(mQueue); \t return EXIT_SUCCESS; } – lachlan