C / C ++服务器,通过stdin / stdout与客户端进行通信(在stdin上阻塞,直到读取了多个字节)

时间:2015-01-19 07:20:35

标签: c++ ipc stdout stdin server

这是关于通过stdin / stdout进行进程间通信的问题。

问题是我有一个COM库,我无法使用任何Java-COM桥(一个特定的功能总是导致核心转储)。但我能够从C ++程序中使用它。

所以我决定用C ++创建一个包装器服务器程序来为我做这些调用,并通过stdin / stdout从Java进行通信,但我在这里面临一个问题。 我决定使用protobufs来传递消息,主要问题是在C ++端读取输入。 我需要一个方法,它会阻塞,直到将一定数量的字节写入stdin才能读取。

我的想法是使用谷歌的protobufs,并建立这样的沟通:

  • C程序启动一个无限循环,阻塞STDIN输入,等待获得4个字节,这将是传入消息的长度。
  • 然后它阻塞以获取整个消息(原始字节计数已知)
  • 使用protobuf解析消息
  • 做好工作
  • 将输出写入stdout(可能以相同的方式,在消息前加上传入的字节数)
  • Java clinet使用DataStream或类似内容读取此内容并使用protobufs进行解密

由于我缺乏C ++和Windows编程知识(我使用MSVS2013社区编译它,并且有很多特定的窗口),设置这种双向通信比我想象的要困难得多来自所有这些COM代码的marcos / typedef。)

是否有一些第三方库,可以创建这么简单的服务器,实际上,简单?

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

1 个答案:

答案 0 :(得分:1)

一个相对简单的消息处理循环可能如下所示。 但是,您应该检查两个读取的返回值并在那里处理错误。

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.
  }
}