2017-08-28 75 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