簡體   English   中英

C / C ++服務器,通過stdin / stdout與客戶端進行通信(在stdin上阻塞,直到讀取了多個字節)

[英]C/C++ server, communicating by stdin/stdout with clients (blocking on stdin until a number of bytes has been read)

這是關於通過stdin / stdout進行進程間通信的問題。

問題是我有一個COM庫,但我無法將其與任何Java-COM橋一起使用(一個特定的功能始終會導致核心轉儲)。 但是我可以通過C ++程序使用它。

因此,我決定用C ++編寫包裝服務器程序來為我調用這些程序,並通過stdin / stdout從Java與之通信,但是我在這里遇到了問題。 我決定使用protobufs來傳遞消息,主要問題是在C ++端讀取輸入。 我需要一個方法,該方法將阻塞直到將一定數量的字節寫入stdin才能讀取。

這個想法是使用Google的protobuf,並像這樣建立通信:

  • C程序啟動一個無限循環,阻塞STDIN輸入,等待輸入4個字節,這將是傳入消息的長度。
  • 然后它阻塞以獲取整個消息(原始字節數已知)
  • 用protobuf解析消息
  • 做工作
  • 將輸出寫入stdout(可能以相同的方式,在消息之前添加傳入的字節數)
  • Java clinet使用DataStream或類似的東西讀取此信息,並使用protobufs解密

由於缺乏對C ++和Windows編程的了解(我使用MSVS2013社區對其進行編譯,並且有太多特定於Windows的marcos / typedefs),設置這兩種通信方式比我想象的要困難得多從所有這些COM代碼)。

有沒有一些第三方庫,可以使創建這樣一個簡單的服務器變得簡單呢?

PS:可以是C,可以是C ++,我只需要它在Windows上運行即可。

一個相對簡單的消息處理循環可能看起來像這樣。 但是,您應該真正檢查兩個讀取的返回值並在那里處理錯誤。

void read_and_process_message(void) {
  while(true) {
    long nMessageBytes;
    read(stdin, &nMessageBytes, sizeof(long));
    //Convert from network byte-order to local byte order
    nMessageBytes = ntohl(nMessageBytes);
    char * buffer = malloc(nMessageBytes);
    read(stdin, buffer, nMessageBytes);
    // Do something with your buffer and write to stdout.
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM