无法从javascript或JQuery

时间:2016-03-21 15:33:16

标签: javascript jquery ajax apache cgi

我试图通过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

如果这是权限问题,您可以建议缺少哪些权限吗?

1 个答案:

答案 0 :(得分:0)

我终于找到了另一篇帮助解决问题的帖子。是的,这是一个权限问题。程序权限覆盖了消息队列权限。一旦解决了这个问题就解决了。 问候 拉克伦