C/C++ 服务器,通过标准输入/标准输出与客户端通信(阻塞标准输入,直到读取了多个字节)

Posted

技术标签:

【中文标题】C/C++ 服务器,通过标准输入/标准输出与客户端通信(阻塞标准输入,直到读取了多个字节)【英文标题】:C/C++ server, communicating by stdin/stdout with clients (blocking on stdin until a number of bytes has been read) 【发布时间】:2015-01-19 07:20:35 【问题描述】:

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

问题是我有一个 COM 库,我无法将它与任何 Java-COM 桥一起使用(一个特定的函数总是会导致核心转储)。但我可以在 C++ 程序中使用它。

所以我决定用 C++ 制作一个包装服务器程序来为我进行这些调用,并通过标准输入/标准输出从 Java 与它通信,但我在这里遇到了一个问题。 我决定使用 protobufs 来传递消息,主要问题是在 C++ 端读取输入。 我需要一个方法,它会阻塞直到将一定数量的字节写入标准输入以供读取。

这个想法是使用 google 的 protobufs,并像这样设置通信:

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

由于我缺乏 C++ 和 Windows 编程知识(我使用 MSVS2013 社区编译它,并且有很多特定于 windows所有这些 COM 代码中的 marcos/typedefs)。

是否有一些 3rd 方库可以让创建这样一个简单的服务器,嗯,实际上,很简单?

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

【问题讨论】:

如果您对 C 感到满意,为什么不直接使用 read(stdin, buffer, bytes) @MichaelAnderson 会阻塞直到有足够的字节数可供读取?我最大的问题是获得这种阻塞,但我对可用的功能数量感到不知所措。我以为 read() 是一个 UNIX 系统调用,但我需要它在 Windows 上运行(毕竟它是在与 COM 通信) unix 版本的 read 默认会阻塞。根据***.com/questions/5684679/…,它可以在<io.h>的windows中使用 @MichaelAnderson 好的,我会尝试 io.h 版本。这对我来说是一个很大的问题 - 找出哪些在 Windows 上有效,哪些无效。 【参考方案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.
  

【讨论】:

我明天试试(这里已经是凌晨 2 点 38 分),我非常希望它可以工作。无论如何,谢谢你的示例代码,我从没想过从网络翻译字节顺序到本地。

以上是关于C/C++ 服务器,通过标准输入/标准输出与客户端通信(阻塞标准输入,直到读取了多个字节)的主要内容,如果未能解决你的问题,请参考以下文章

C/C++编程笔记:C++中的标准输入流 & 标准输出流

c/c++标准库中的文件操作总结

[C/C++]C++的IO流

[C/C++]C++的IO流

重定向与管道

C/C++ - 运行 system("process &") 然后写入它的标准输入