我有一个C代码,在无限循环内等待输入并产生输出。
#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();
}
}
我需要另一个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请求)也是受欢迎的。 提前谢谢。
答案 0 :(得分:1)
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))
如果它接收多个simultaneouso请求,这可能会很棘手。您需要跟踪客户端(原始请求)以做出正确的响应(回答正确的请求客户端)
或者为每个请求创建一个queu并生成一个子项(一次最多只有X
个孩子同时工作),这样它们就会按照要求生成并且一旦不需要就被杀死(让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 Addon的事件/消息。