2017-08-28 33 views
0

我有一个C代码,在无限循环内等待输入并产生输出。IPC:使用简单C代码的节点JS服务器通信

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

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

    } 
} 

我需要另一个节点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服务器错误和网络响应终止包括283线的响应,而不是1

任何人都可以请帮我?也欢迎其他一些解决此问题的方法(从C可执行代码输出回复Web请求)。 预先感谢您。

+0

的第一个请求会关闭子的标准输入。你如何期待第二次请求被提供? –

回答

1

child_process.spawn

菌种C代码的二进制从节点(双向通信)

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 simultaneousos children worki在时间NG)因此它们衍生的要求和杀死一旦不再需要(具有queu是节流活性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

+0

'child.stdin.end('7')'让我的C代码陷入无限循环。 stdin不净使用,但仍然在stdin缓冲区 – Sam

+0

尝试使用'child.stdin.write'而不是 – EMX

+0

在这种情况下child.stdout.on('data',function)不会被触发 – Sam