繁体   English   中英

使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM