0

我使用 FIFO 命名管道为客户端和服务器创建了两个管道。然后我尝试执行客户端和服务器之间的通信。当从客户端向服务器发送消息时,通信有效,反之亦然。请帮助。

这是三个代码:

fifo.c(创建管道)

#include<stdio.h> 
#include<fcntl.h>
#include<stdlib.h>
main()
{
int file1,file2;
int fd;
char str[256];
char temp[4]="how";
char temp1[4];
file1 = mkfifo("fifo_server",0666); 
if(file1<0) {
 printf("Unable to create a fifo");
 exit(-1);
 }

file2 = mkfifo("fifo_client",0666);

if(file2<0) {
 printf("Unable to create a fifo");
 exit(-1);
 }
printf("fifos server and child created successfuly\n ");
}

server.c(从客户端发送和接收)

#include<stdio.h> 
#include<fcntl.h>
#include<stdlib.h>
main()
{
FILE *file1;
int fifo_server,fifo_client;
char *choice;
char *buf;
if(fork() == 0)
    {
        while(1)
        {   
        fifo_server = open("fifo_server",O_RDWR);
        if(fifo_server<1) {
         printf("Error opening file");
         }

        read(fifo_server,choice,sizeof(choice));
        printf("%s\n",choice);
        close(fifo_server);
        }
        //sleep(3);


    }
else
{
    while(1)
    {   
        buf = malloc(10*sizeof(char));  
        scanf("%s",buf);

        fifo_client = open("fifo_client",O_RDWR);

        if(fifo_client<1) {
         printf("Error opening file");
         }



         write(fifo_client,buf,sizeof(buf)); 
        close(fifo_client);

    }
}

close(fifo_server);
close(fifo_client);
}

client.c(从服务器发送和接收)

#include<stdio.h> 
#include<fcntl.h>
#include<stdlib.h>
main()
{
 FILE *file1;
 int fifo_server,fifo_client;
 char str[256];
 char *buf;
 char *choice;
 printf("Welcome to chat\n\n");
if(fork() == 0)
    {   

    while(1)
    {
         choice = malloc(10*sizeof(char));
         scanf("%s",choice);

         fifo_server=open("fifo_server",O_RDWR);
         if(fifo_server < 1) {
          printf("Error in opening file");
          exit(-1);
          }

         write(fifo_server,choice,sizeof(choice));

         //sleep(10);   
    }    


    }
 else{
    while(1)
    {


        fifo_client = open("fifo_client",O_RDWR);
        if(fifo_client<1) {
         printf("Error opening file");
         exit(1);
         }

        read(fifo_client,choice,sizeof(choice));
        printf("%s\n",choice);

        /*      
        fifo_client=open("fifo_client",O_RDWR);

         if(fifo_client < 0) {
          printf("Error in opening file");
          exit(-1);
          }

         buf=malloc(10*sizeof(char));
         read (fifo_client,buf,sizeof(buf));
         printf("\n %s***\n",buf);
        */
    }

}

close(fifo_server); 
close(fifo_client);  
}
4

2 回答 2

1

一些观察:

  • 你读到choice但你从来没有为它分配内存。
  • 不要在每次迭代中使用 malloc() 和 open()/close(),而是使用静态字符缓冲区,例如buf[512]来自网络的 read()s 和 write()s (write() strnlen() bytes/chars)。

例如,而不是:

char *buf;
char *choice;
printf("Welcome to chat\n\n");
if(fork() == 0) {   
  while(1) {
    choice = malloc(10*sizeof(char));
    scanf("%s",choice);

    fifo_server=open("fifo_server",O_RDWR);
    if(fifo_server < 1) {
      printf("Error in opening file");
      exit(-1);
    }
   write(fifo_server,choice,sizeof(choice));
}

执行以下操作:

char buf[512];
if(fork() == 0) {
  fifo_server = open("fifo_server", O_RDWR);
  if(fifo_server < 1) {
      printf("Error in opening file");
      exit(-1);
  }
  while(1) {
    fgets(buf, 512, stdin);
    write(fifo_server, buf, strnlen(buf, 512));
    /* here should be checks for number of bytes/chars written */
  }
}
于 2013-12-09T10:33:20.487 回答
0

刚刚写完一个似乎可以工作的服务器和客户端程序!我在文件夹的终端中创建了管道。它们被命名为 myPipeC 和 myPipeS(分别用于客户端和服务器)。

这是client.c

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

int main(int argc, const char * argv[]) {
    int myPipeC = open("myPipeC", O_RDWR);
    int myPipeS = open("myPipeS",O_RDWR);
    pid_t cpid;
    char buf[255];
    char send[255];
    int n;
    int saveIn = dup(fileno(stdin));
    int saveOut = dup(fileno(stdout));
    while(1) {
        if ((cpid = fork()) == 0 ) {
            while(1){
                while((n=read(myPipeC,&buf,255)) > 0){
                    write(fileno(stdout), &buf, n*sizeof(char));
                }
            }
        } else {
            while(1){
                fgets(send, 255,stdin);
                int len = strlen(send);
                write(myPipeS,send,(len+1)*sizeof(char));
            }
        }
    }
    close(myPipeC);
    close(myPipeS);
    fflush(stdin);
    fflush(stdout);
    dup2(saveIn,fileno(stdin));
    dup2(saveOut, fileno(stdout));
    exit(EXIT_SUCCESS);
} 

服务器.c

int main(int argc, const char * argv[]) {
    int myPipeC = open("myPipeC", O_RDWR);
    int myPipeS = open("myPipeS",O_RDWR);
    pid_t cpid;
    char buf[255];
    char send[255];
    int n;
    int saveIn = dup(fileno(stdin));
    int saveOut = dup(fileno(stdout));
    while(1) {
        if ((cpid = fork()) == 0 ) {
            while(1){
                while((n=read(myPipeS,&buf,255)) > 0){
                     write(fileno(stdout), &buf, n*sizeof(char));
                }
            }
        } else {
            while(1){
                fgets(send, 255,stdin);
                int len = strlen(send);
                write(myPipeC,send,(len+1)*sizeof(char));
            }
        }
    }
    close(myPipeC);
    close(myPipeS);
    fflush(stdin);
    fflush(stdout);
    dup2(saveIn,fileno(stdin));
    dup2(saveOut, fileno(stdout));
    exit(EXIT_SUCCESS);
} 
于 2016-07-18T14:13:20.510 回答