我试图通过JavaScript或JQuery向webclient发送消息到Debian Jessie上的Apache2 webserver,执行编译的C程序发送POSIX message_queue,但我无法让它工作。
我的cgi目录中有以下文件: root @ asus:/ var / www / cgi-bin #ls -l -rwxr-xr-x 1 www-data www-data 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是一个C编译的可执行文件,用于生成POSIX消息。如果我执行 lachlan @ asus:〜$ /var/www/cgi-bin/mq_client.cgi 服务器发送和接收正确的消息。
Test.pl是一个生成html代码的perl scrpt,如果我执行的话
lachlan @ asus:〜$ /var/www/cgi-bin/test.pl
这也很好,并提供输出:
内容类型:text / html
只是测试。
如果我使用铬网络服务器如下: http://localhost/cgi-bin/test.pl 我得到了正确的结果:'Just Testing'
但是,我无法从网络服务器获取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因其对最终用户体验的不利影响而被弃用。如需更多帮助,请查看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";
Chromium中未显示任何错误,但也没有发送消息
//选项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" -->
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(内部服务器错误)
我已经审阅了很多参考资料并尝试了他们的建议,但还没有解决问题。
任何关于在哪里寻找问题的想法都将受到赞赏。 拉克伦
服务器端代码生成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-data www-data 59008 3月20日17:47 mq_client.cgi
如果这是权限问题,您可以建议缺少哪些权限吗?
答案 0 :(得分:0)
我终于找到了另一篇帮助解决问题的帖子。是的,这是一个权限问题。程序权限覆盖了消息队列权限。一旦解决了这个问题就解决了。 问候 拉克伦