IPC:Node JS服务器用简单的C代码进行通信 [英] IPC : Node JS server communication with simple C code

查看:15
本文介绍了IPC:Node JS服务器用简单的C代码进行通信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个C代码,它在无限循环中等待输入并产生输出。

#include<stdio.h>
void flush() {
    int c;
    while ((c = getchar()) != '
' && c != EOF);
}

int main() {
    /*
     *  Load many files here
     */
    double d = 0;
    char input[1024];
    while (1) {
        d = d + 0.1;
        scanf("%[^
]", input);        
        printf("%lf
",d);
        fflush(stdout);
        flush();

    }
}

我需要另一个Node JS服务,它将在某个端口上侦听并将输出作为响应发送。 我编写了此代码

var http = require('http');


var spawn = require('child_process').spawn;

var child = spawn('./dummyNLU.out');
child.stdin.setEncoding('utf-8');
child.stdin.cork();
var buffer = new Buffer(100);
var app = http.createServer(function(req,res){
    var string = buffer.write("HelloWorld!"); //this is for testing purpose
    child.stdin.write(buffer);
    child.stdin.end();
    child.stdout.on('data', function(data) {
        res.setHeader('Content-Type', 'text/plain');
        res.end(data);
    });
});

app.listen(3001);

我的这段代码似乎根本不起作用。

节点JS服务器因错误而终止,并且Web响应由283行响应组成,而不是1行。

谁能帮帮我??解决这个问题的一些其他方法(从C可执行代码输出回复Web请求)也是受欢迎的。 提前谢谢您。

推荐答案

child_process.spawn

将C代码二进制文件作为子级从Node派生(双向通信)

var spawn = require('child_process').spawn
var child = spawn('main.exe')   
child.stdin.end('7')
child.stdout.on('data', (data) => { console.log(data); })
child.on('close', (code) => console.log('Exit code: ' + code))

如果它接收多个Simultaneos请求,这可能会很棘手,您将需要跟踪客户端(原始请求)才能做出正确的响应(回答正确的请求客户端)

或者创建一个队列并为每个请求派生一个子进程(一次最多有X个Simultaneos子进程在工作),以便根据请求派生它们,并在不需要时终止它们(使用队列是为了限制活动C进程的总数)

poC节点派生子命令(ls)并打印结果(派生进程的stdout)

    const spawn = require('child_process').spawn 
    const C = spawn('ls');let r='' 
    C.stdout.on('data',d=>r+=d) 
    C.on('close', () => console.log(r)); 

streaming-worker

旨在为您提供一个简单的发送和接收界面 来自长时间运行的异步C++Node.js插件的事件/消息。

Streaming data from C to Node.js

这篇关于IPC:Node JS服务器用简单的C代码进行通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆