gpt4 book ai didi

c - 正确的 FIFO 客户端-服务器连接

转载 作者:IT王子 更新时间:2023-10-29 00:26:24 25 4
gpt4 key购买 nike

我正在尝试编写简单的客户端和服务器 C 程序,在不同的终端中相互通信。

服务器必须创建一个公共(public) fifo 并等待客户端。与此同时,客户端正在创建他自己的 fifo,服务器的响应将通过它来。客户端的任务是向服务器发送一个由队列创建的名称,并返回 ls 命令的结果。

我确实搜索了一个答案,例如:fifo-server-programexample-of-using-named-pipes-in-linux-bashhow-to-send-a-simple-string-between-two-programs-using-pipes。我从第三个链接的代码开始慢慢修改。

我现在得到的是一个客户端,它从用户那里获取输入,将其发送到服务器并接收回来。但它只能工作一次。我不知道为什么。主要功能的主体如下。如果有任何帮助,我将不胜感激。

编辑:我成功了! :D 代码在下面,也许它会对某人有所帮助。

server.c代码:

#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char* argv[])
{
int fds[2];
char tab[BUFSIZ];
int fd, n;

char *myfifo = "/tmp/serwer";
char *myfifo2 = "/tmp/client";

pipe(fds);
mkfifo(myfifo,0666);

while(1)
{
fds[0]=open(myfifo2,O_RDONLY);
fds[1]=open(myfifo,O_WRONLY);

read(fds[0],tab,BUFSIZ);

if (strcmp("klient",tab)==0) {
printf("Od klienta: %s\n",tab);
fd=open(tab,O_WRONLY);

if(fork()==0)
{
dup2(fds[1],1);
close(fds[1]);
execlp("ls","ls","-l",NULL);
close(fds[0]);
close(fds[1]);
}
else
{
dup2(fds[0],0);
n = read(fds[0],tab,BUFSIZ);
write(fd,tab,n);
close(fds[0]);
close(fds[1]);
}
}
memset(tab, 0, sizeof(tab));
close(fd);
close(fds[0]);
close(fds[1]);
}

unlink(myfifo);
return 0;
}

client.c代码:

#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char* argv[])
{
int fds[2];
char *myfifo = "/tmp/serwer";
char *myfifo2 = "/tmp/client";

mkfifo(myfifo2,0666);
fds[0]=open(myfifo,O_RDONLY);
fds[1]=open(myfifo2,O_WRONLY);

char tab[BUFSIZ];
memset(tab, 0, sizeof(tab));

write(fds[1],"klient",6);
perror("Write:"); //Very crude error check
read(fds[0],tab,sizeof(tab));
perror("Read:"); // Very crude error check

printf("Odebrano od serwera: %s\n",tab);

close(fds[0]);
close(fds[1]);
unlink(myfifo2);
return 0;
}

最佳答案

为什么不直接管理服务器中的两个 fifo?只需更改您的代码即可使其正常工作。

如果你真的想要一个客户端-服务器关系,一个服务器为许多不同的客户端服务,套接字可能是更好的选择。

客户端.cpp

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
int client_to_server;
char *myfifo = "/tmp/client_to_server_fifo";

int server_to_client;
char *myfifo2 = "/tmp/server_to_client_fifo";

char str[BUFSIZ];
printf("Input message to serwer: ");
scanf("%s", str);


/* write str to the FIFO */
client_to_server = open(myfifo, O_WRONLY);
server_to_client = open(myfifo2, O_RDONLY);
write(client_to_server, str, sizeof(str));

perror("Write:"); //Very crude error check

read(server_to_client,str,sizeof(str));

perror("Read:"); // Very crude error check

printf("...received from the server: %s\n",str);
close(client_to_server);
close(server_to_client);

/* remove the FIFO */

return 0;
}

服务器.cpp

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>

int main()
{
int client_to_server;
char *myfifo = "/tmp/client_to_server_fifo";

int server_to_client;
char *myfifo2 = "/tmp/server_to_client_fifo";

char buf[BUFSIZ];

/* create the FIFO (named pipe) */
mkfifo(myfifo, 0666);
mkfifo(myfifo2, 0666);

/* open, read, and display the message from the FIFO */
client_to_server = open(myfifo, O_RDONLY);
server_to_client = open(myfifo2, O_WRONLY);

printf("Server ON.\n");

while (1)
{
read(client_to_server, buf, BUFSIZ);

if (strcmp("exit",buf)==0)
{
printf("Server OFF.\n");
break;
}

else if (strcmp("",buf)!=0)
{
printf("Received: %s\n", buf);
printf("Sending back...\n");
write(server_to_client,buf,BUFSIZ);
}

/* clean buf from any data */
memset(buf, 0, sizeof(buf));
}

close(client_to_server);
close(server_to_client);

unlink(myfifo);
unlink(myfifo2);
return 0;
}

关于c - 正确的 FIFO 客户端-服务器连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8611035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com