c - 先进先出流水线服务器仅接收一定数量的数据

标签 c client-server pipeline mkfifo

所以我尝试使用 mkfifo() 在 C 中实现基本的 FIFO 管道。 到目前为止,这是我的代码类:

main.c:

int main(int argc, char *argv[]) {
char *path = "/tmp/fifo";
pid_t pid;

setlinebuf(stdout);
unlink(path);
mkfifo(path, 0600);

pid = fork();
if (pid == 0) {
    client(path);
} else {
    server(path);
}

return(0);
}

客户端.c:

void client(char *path) {

char *input;
input = (char *)malloc(200 * sizeof(char));

read(STDIN_FILENO, input, 200);

struct Message message;
message = protocol(input); //protocol simply takes an input string and formats it
char number = message.server;
char* string;
string = message.string;

int fd;

fd = open(path, O_WRONLY);
write(fd, string, sizeof(string));
printf("Client send: %s\n", string);
close(fd);


return;
}

服务器.c:

void server(char *path) {
int fd;
char *input;
input = (char *)malloc(200 * sizeof(char));

fd = open(path, O_RDONLY);
read(fd, input, sizeof(input));
printf("Server receive: %s\n", input);
close(fd);

return;
}

现在管道正在工作,但由于某种原因服务器只收到部分消息。例如,如果我们从协议(protocol)中获取以下字符串:“HELLO WORLD”,我们将得到以下输出:

Server receive: HELLO WO
Client send: HELLO WORLD

服务器应该收到整个消息,但事实并非如此。我究竟做错了什么?感谢您的帮助!

最佳答案

我注意到您忽略了对openreadwrite返回值的通常必要的检查。如果有的话,您可能已经注意到这一行中的错误

write(fd, string, sizeof(string));

因为 string 是一个指针,所以您要发送 8 个字节(指针的大小)。您应该使用 strlen(string)+1,具体取决于是否需要发送终止符。

write(fd, string, strlen(string));

您重复了最近不明智的编辑中的错误:

read(fd, input, sizeof(input));

您最好坚持使用原始的 #define 并将其用于缓冲区分配和读取请求大小。

关于c - 先进先出流水线服务器仅接收一定数量的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37598758/

相关文章:

c - 如果 fgetc 读取 0xFF 会发生什么?

c++ - [文字游戏]Quiddler Solver Algorithm

python - sklearn 管道中的持久标签编码

powershell - 无法通过 Gitlab Api (v3/v4) 标记/触发 "Merge when pipeline succeeds"

python-3.x - 管道中的拟合与拟合变换

c - `scanf("%*[^\n]%*c")` 是什么意思?

android - 为什么应用程序在调试期间可以工作,但在运行时却不能工作?

java.io.InvalidClassException : local class incompatible:

language-agnostic - 实时服务器中的 fatal error

c - 使用 C 从 HTML 文档中提取信息