клиент не читает из частного fifo

#c #private #public #fifo

#c #Частное #общедоступный #fifo

Вопрос:

Я работал над этим кодом, где клиент должен читать с сервера. Клиент запишет 1 имя и 3 значения на сервер, и сервер должен вернуть это через частный fifo. дело в том, что клиент не читает частный fifo с сервера. Я ожидаю получить обратно значения, которые создает сервер. вот код как для клиента, так и для сервера:

* редактировать: согласно предложению в комментариях, вот мои входные данные как для клиента, так и для сервера… на стороне сервера я ввел «1» клиент, чтобы он получил 1 клиента. клиент: я ввел любое имя (допустим, home), затем для чисел 100, 150 и 200 серверная сторона получает все это, затем сервер должен отправить «адрес памяти» каждого из них через частный fifo. клиент не получает ни одного из адресов памяти и просто получает случайные отрицательные числа

Клиент:

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

struct values {
  int intVal0[1];
  int intVal1[1];
  int intVal2[1];
  int adss[7];
  int freeSp[1];
  };
struct strings {
  char strbuff[100];
  char privateFIFO[14];
  };

main (void)
{
  struct values val;
  struct strings strs;
  int fda;  // to write to server
  int fdb;  // to read response from server
  int clientID;
  char temp[14];
  memset(val.freeSp,0,1);
  memset(strs.strbuff,0,100); 
  memset(val.intVal0,0,1); 
  memset(val.intVal1,0,1);
  memset(val.intVal2,0,1);
  memset(val.adss,0,7); 
  memset(strs.privateFIFO,0,14); 

  clientID = getpid();
  sprintf(strs.privateFIFO, "FIFO_%d", clientID);
  printf("nFIFO name is %sn", strs.privateFIFO);

  if((fda=open("FIFO1", O_WRONLY))<0)
     printf("cant open fifo to write");

  printf("You have 3 segments inwhich to put your program.");
  printf("nYou have a total of 2000mu.");
  printf("nClient: Please enter the name of the program: ");
  scanf("%s", amp;strs.strbuff);
  strcpy(strs.strbuff, strs.strbuff);
  printf("nClient: Please enter a how the amount of memory for segment 0: ");
  scanf("%d", amp;val.intVal0);
  while(val.intVal0[0] <= 0)//while loop to make sure segment 0 gets a value greater than 0
    {
       printf("Client: Please reenter an amount of memory that is 0 or higher for segment 0: ");
       scanf("%d", amp;val.intVal0);
    }   
  printf("Client: Please enter a how the amount of memory for segment 1: ");
  scanf("%d", amp;val.intVal1);
  while(val.intVal1[0] <= 0)//while loop to make sure segment 1 gets a value greater than 0
    {
       printf("Client: Please reenter an amount of memory that is 0 or higher for segment 1: ");
       scanf("%d", amp;val.intVal1);
    }
  printf("Client: Please enter a how the amount of memory for segment 2: ");
  scanf("%d", amp;val.intVal2);
  while(val.intVal2[0] <= 0)//while loop to make sure segment 2 gets a value greater than 0
    {
       printf("Client: Please reenter an amount of memory that is 0 or higher for segment 2: ");
       scanf("%d", amp;val.intVal2);
    }

  write(fda, amp;strs, sizeof(struct strings));
  write(fda, amp;val, sizeof(struct values));

  printf("nClient: Got the values sent, now waiting for responsen ");
  if((fdb=open(strs.privateFIFO, O_RDONLY))<0)
     printf("ncant open fifo to read");

  read(fdb, amp;val, sizeof(struct values));
  if (val.freeSp[0] >= 0 amp;amp; val.freeSp[0] >= val.intVal0[0] amp;amp; val.freeSp[0] >= val.intVal1[0] amp;amp; 
    val.freeSp[0] >= val.intVal2[0])// if free space is greater than 0, prints what is below
    {  
          printf("nClient: address of segment 0: %d - %d", val.adss[0], val.adss[1]);
          printf("nClient: address of segment 1: %d - %d", val.adss[2], val.adss[3]);
          printf("nClient: address of segment 2: %d - %d", val.adss[4], val.adss[5]);
          printf("nClient: free space available: %dn", val.freeSp[0]);
          printf ("nall done!n");
    }
   else// if free space is less than or equal to 0, prints below
    {
         printf("nClient: No memory allocated because segment sizes are too big");
         printf ("nall done!n");
    }
  close(fda);
  close(fdb);



}
  

вывод клиента:

 Client: Please enter the name of the program: home

Client: Please enter a how the amount of memory for segment 0: 100
Client: Please enter a how the amount of memory for segment 1: 150
Client: Please enter a how the amount of memory for segment 2: 200

Client: Got the values sent, now waiting for response

cant open fifo to read
Client: address of segment 0: 0 - 134217728
Client: address of segment 1: -17028108 - -17701883
Client: address of segment 2: -18270303 - 134549970
Client: free space available: 134511872
  

сервер:

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

struct values {
  int intVal0[1];
  int intVal1[1];
  int intVal2[1];
  int adss[7];
  int freeSp[1];
  };

struct strings {
  char strbuff[100];
  char privateFIFO[14];
  };

main (void)
{
  struct values val;
  struct strings strs;
  int fda;  // to read from client
  int fdb;  // to write to client
  int finish;   // lets me know that client is done
  int i;    // because C needs this defined as int
  int n =0;  //counter for amount of clients 
  int m = 0;  //counter for addresses on server
  int mem = 2000; // set allocated memory
  int inputMemTot;// total amount of segmented memory from client
  int numClient; // input of number of clients
  int upkeep = 0; // keeps the last place of memory address 
  int adssOnSvr[100];  // array that keeps track of all client addresses, only on server
  char prgName[10][14];// array that will store program names

  memset(strs.strbuff,0,100); 
  memset(val.intVal0,0,1); 
  memset(val.intVal1,0,1);
  memset(val.intVal2,0,1);
  memset(val.freeSp,0,1);
  memset(val.adss,0,7); 
  memset(strs.privateFIFO,0,14);
  printf("nServer: Please enter the name of clients: ");
  scanf("%d", amp;numClient);

  for( i = 0; i < numClient; i  )
  {
     if ((mkfifo("FIFO1",0666)<0 amp;amp; errno != EEXIST))
     {
         perror("cant create FIFO1");
         exit(-1);
     }

     if((fda=open("FIFO1", O_RDONLY))<0)
         printf("cant open fifo to write");


     read(fda, amp;strs, sizeof(struct strings));
     read(fda, amp;val, sizeof(struct values));    //read the character
     memset(val.adss,0,7); 
     strcpy(strs.strbuff, strs.strbuff);
     strcpy(strs.privateFIFO, strs.privateFIFO);
     //strcpy(prgName[i][14], strs.strbuff);
     inputMemTot = val.intVal0[0]   val.intVal1[0]   val.intVal2[0];// adds up all segment sizes 
     val.freeSp[0] = mem - inputMemTot;// puts the value of free space into here
     printf("Server: just got the program name: %s", strs.strbuff);
     printf("nServer: just got the size of segment0: %d", val.intVal0[0]);
     printf("nServer: just got the size of segment1: %d", val.intVal1[0]);
     printf("nServer: just got the size of segment2: %dn", val.intVal2[0]);

     if(upkeep = 0)
     {
         val.adss[0] = 0;  // set address location for starting value of segment 0
         adssOnSvr[0] = 0;
     }
     else 
         val.adss[0] = upkeep;
     val.adss[1] = val.intVal0[0] - 1; // set address location for ending value of segment 0
     adssOnSvr[1   m] = val.adss[1];
     val.adss[2] = val.intVal0[0]; // set address location for starting value of segment 1
     adssOnSvr[2   m] = val.adss[2];
     val.adss[3] =  val.adss[2]   val.intVal1[0] - 1; // set address location for ending value of segment 1
     adssOnSvr[3   m] = val.adss[3];
     val.adss[4] = val.adss[3]   1; // set address location for starting value of segment 2
     adssOnSvr[4   m] = val.adss[4];
     val.adss[5] =  val.adss[4]   val.intVal2[0];// set address location for ending value of segment 2
     adssOnSvr[5   m] = val.adss[5];
     val.adss[6] = 0;
     upkeep = val.adss[5];
     m = m   5;

     if ((mkfifo(strs.privateFIFO,0666)<0 amp;amp; errno != EEXIST))
      {
         perror("cant create client fifo");
         exit(-1);
      }

     if((fdb=open(strs.privateFIFO, O_WRONLY))<0)
         printf("cant open %s to read", strs.privateFIFO);

     write(fdb, amp;val, sizeof(struct values)); 

     close(fda);
     close(fdb);
     unlink("FIFO1");
     unlink(strs.privateFIFO);
     /*if(i == numClient)
         break;*/
    }
  if (val.freeSp[0] >= 0)// if free space is greater than 0, prints what is below
    {  
      for(n = 0; n < numClient; n  )
      {
         m = 0;
         //printf("nServer: Program %s", prgName[n][14]);
         if(n = 0)
             printf("nServer: address of segment 0: %d - %d", adssOnSvr[0], adssOnSvr[1   m]);
         else
             printf("nServer: address of segment 0: %d - %d", adssOnSvr[0   m], adssOnSvr[1   m]);

         printf("nServer: address of segment 1: %d - %d", adssOnSvr[2   m], adssOnSvr[3   m]);
         printf("nServer: address of segment 2: %d - %d", adssOnSvr[4   m], adssOnSvr[5   m]);
         m = m   5;
      }
      printf("nServer: free space available: %dn", val.freeSp[0]);

    }
  if(val.freeSp[0] <= 0)// if free space is less than or equal to 0, prints below
    {   
       printf("nServer: Segment sizes are to big. No memory allocated.n");

    }

   printf("nServer: This says I am ready to close n");
  /*close(fda);
  close(fdb);
  /*unlink("FIFO1");*/
}
  

вывод сервера:

 Server: Please enter the name of clients: 1
Server: just got the program name: home
Server: just got the size of segment0: 100
Server: just got the size of segment1: 150
Server: just got the size of segment2: 200
  

после этого сервер ничего не делает, и мне приходится выходить вручную, используя control c

Комментарии:

1. Что именно вы ожидали, и что именно происходит на самом деле?

2. Я ожидаю, что значения, которые я отправляю клиенту, возвращаются с сервера. что происходит, клиент не может открыть частный fifo для чтения, и он помещает разные значения, отличные от тех, которые я отправил

3. Я точно сказал — что вы ввели для запуска обеих программ, что вы ввели в обе программы (если что-нибудь), что выводит клиент, что выводит сервер?

4. ооо … на стороне сервера я ввел 1 клиент, чтобы он получил 1 клиента. клиент: я ввел любое имя (допустим, home), затем для чисел 100, 150 и 200 серверная сторона получает все это, затем сервер должен отправить «адрес памяти» каждого из них через частный fifo. клиент не получает ни одного из адресов памяти и просто получает случайные отрицательные числа

5. Итак, клиент не печатает «не могу открыть fifo для чтения», так почему вы сказали, что клиент не может открыть FIFO для чтения?