![](/img/trans.png)
[英]kill() function problem in client-server ipc message using 2 FIFOs
[英]client-server application using fifos
我正在尝试使用 2 个 fifos(client_to_server 和 server_to_client)用 C 语言编写客户端-服务器应用程序。 客户端向读取它的服务器写入命令的应用程序版本运行良好,但是当我在客户端中添加行以从服务器读取答案时,它不再起作用:服务器在读取时被阻止来自客户端的命令(好像 client_to_server fifo 中什么都没有,尽管客户端写在里面)。 在这种情况下可能有什么问题?
client.c:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#define MAX_BUF_CMD 100
FILE* open_fifo_send(char *nume_fifo);
FILE* open_fifo_rec(char *nume_fifo);
void send_command(FILE *c2s);
void rec_answer(char* str, FILE *s2c);
int main()
{
FILE *c2s, *s2c;
char ans[100];
char cmd[100];
c2s=open_fifo_send("canal_c2s");
s2c=open_fifo_rec("canal_s2c");
printf("[client] Conectare la server reusita!\n");
send_command(c2s);
rec_answer(ans, s2c); /*without this line works fine */
return 0;
}
FILE* open_fifo_send(char *nume_fifo)
{
int fd;
//FILE* c2s;
if(-1==(fd=open(nume_fifo, O_WRONLY)))
{
perror("[client]Eroare la open canal_c2s");
exit(2);
}
return fdopen(fd, "w");
}
FILE* open_fifo_rec(char *nume_fifo)
{
int fd;
//FILE* s2c;
if(-1==(fd =open(nume_fifo, O_RDONLY)))
{
perror("[client]Eroare la open canal_s2c");
exit(2);
}
return fdopen(fd, "r");
}
void send_command(FILE *c2s)
{
char cmd[MAX_BUF_CMD];
int bytes;
printf("Da-ti o comanda:\n");
fgets(cmd,100,stdin);
if(fputs(cmd, c2s)==EOF)
{
perror("[client] Eroare la scrirea in canal_c2s");
exit(3);
}
printf("[client]Am dat comanda: %s\n", cmd);
}
void rec_answer(char *str,FILE *s2c)
{
int lungime_raspuns;
fgets(str,100, s2c);
}
server.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#define MAX_BUF 100
void create_fifo_client_to_server();
void create_fifo_server_to_client();
FILE *open_fifo_rec(char *nume_fifo);
FILE *open_fifo_send(char *nume_fifo);
void rec_command(char* str, FILE* fd);
void send_answer(FILE *fd);
int main()
{
FILE *c2s, *s2c;
char cmd[MAX_BUF];
create_fifo_client_to_server();
create_fifo_server_to_client();
c2s=open_fifo_rec("canal_c2s");
s2c=open_fifo_send("canal_s2c");
printf("[server] Clientul s-a conectat\n");
rec_command(cmd, c2s);
printf("Am primit comanda: %s\n", cmd);
fprintf(s2c, "message to client");
unlink("canal_c2s"); //remove fifo
unlink("canal_s2c");
return 0;
}
void create_fifo_client_to_server()
{
if(-1==mkfifo("canal_c2s", 0666)){
perror("[server]Eroare la mkfifo c2s");
exit(1);
}
}
void create_fifo_server_to_client()
{
if(-1==mkfifo("canal_s2c", 0666)){
perror("[server]Eroare la mkfifo s2c");
exit(1);
}
}
FILE* open_fifo_rec(char *nume_fifo)
{
int fd;
//FILE *c2s;
if(-1==(fd=open(nume_fifo, O_RDONLY)))
{
perror("[server]Eroare la open canal_c2s");
exit(2);
}
return fdopen(fd, "r");
}
FILE* open_fifo_send(char * nume_fifo)
{
int fd;
//FILE *s2c;
if(-1==(fd=open(nume_fifo, O_WRONLY)))
{
perror("[server]Eroare la open canal_s2c");
exit(2);
}
return fdopen(fd,"w");
}
void rec_command(char *str, FILE *c2s)
{
fscanf(c2s, "%s", str);
}
void send_answer(FILE *s2c)
{
fprintf(s2c, "asdgf");
}
您正在使用fputs
将数据发送到服务器。 这意味着数据可以保留在本地缓冲区中,直到缓冲区已满或您明确刷新它。 当您不等待答案而是从客户端退出时,fifo 会被隐式刷新并关闭,从而导致服务器收到某些信息。 但是,如果您在没有事先刷新的情况下开始在客户端等待,则会以死锁告终。
但请记住:管道是为单向通信而发明的。 如果您想要使用确认和/或同步的 2 路通信,您应该考虑使用套接字。
看起来像您的实现中的错误。 您将需要调试或发布您的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.