我想通过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