2

我正在做一个实验任务,我们制作一个服务器程序和一个客户端程序。它在 QNX 操作系统上。不确定它是否在 Linux 中运行。大纲是这样的:

“编写一对 C 程序 msgSender.c 和 msgLogger.c 来演示进程之间的 Neutrino 消息传递。

您的程序将从 shell 调用为:

$ msgLogger logFileName $ msgSender msgLogger

logFileName 是存储消息的日志的名称

msgLogger 进程充当记录器。它接收消息并将消息写入文件。

  1. msgLogger 接收 msg.h 中所示格式的基于文本的消息。它必须测试消息头并且仅在消息类型为 MSG_DATA 时将消息文本写入日志文件。
  2. 如果接收到 MSG_DATA,则回复状态为 MSG_OK。
  3. 如果收到 MSG_END,则服务器回复状态为 MSG_END,然后清理并退出。
  4. 如果收到的消息不是 MSG_DATA 或 MSG_END,则回复状态为 MSG_INVALID,并且不记录消息文本。将记录一条警告消息。
  5. 该进程通过将其 ND PID CHID 写入名为 msgLogger.pid 的文件来宣传其存在,其中文件名的“msgLogger”部分取自 argv[0]。
  6. 记录的消息带有时间和发件人的 ND PID COID 标记。

msgSender 是一个交互式程序,用于组装和发送基于文本的消息。

  1. 从命令行读取记录器进程的名称,并使用该名称来构建 .pid 文件的名称,它会在其中读取 ND PID CHID。
  2. 它提示用户输入消息标题类型,然后提示用户输入消息文本。
  3. 如果它收到来自服务器的 MSG_END,它将退出。
  4. 如果从服务器接收到 MSG_INVALID,它会打印一个警告

    • 您的客户端和服务器必须与我的客户端和服务器互操作。
    • 验证服务器是否与多个并发客户端正常工作。
    • 如果在每条日志消息之后刷新服务器的文件写入缓冲区,则可以在后台运行它并使用 $ tail -f logFile 来查看收到的消息。
    • 请务必检查命令行参数的有效性。
    • 仅在必要时使用全局变量。"

我已经让 msgLogger 完全正常工作了;这是代码: http: //pastebin.com/8AGfGZ5u

这是 msg.h 文件: http ://pastebin.com/3xcBZvnH

这是迄今为止我为 msgSender 提供的代码:http: //pastebin.com/Buk88Kry

发送者(客户端)需要做的是让用户使用数字输入消息类型。msg.h 文件包含消息编号的类型,其中 MSG_DATA 为 1 等。如果他们输入无效数字,它将要求他们重试,否则它将存储该数字并将其分配给 amsg.m_hdr消息结构。amsg.m_data 是消息的值。

然后用户输入他们想要的消息,如果他们选择了数字1(msg_data),服务器发送通知,客户端打印“消息成功接收”,同时消息的内容被保存到日志文件中。

不幸的是,我遇到了很多问题,并且没有记录消息。我明天必须交 msgSender,这也取决于我的下一个实验室。我真的希望我能得到一些帮助。

4

1 回答 1

0

尝试在客户端写入后刷新缓冲区。如果您在写入文件时不关闭文件描述符,则不会显示缓冲区已刷新并且文件已写入。您可以通过调用 fsync() 来确保您的所有写入同步到您想要的文件。

于 2013-05-10T14:44:34.247 回答