客户端/服务器打印出数组并回写

时间:2015-10-20 18:20:07

标签: c arrays server client fifo

我正在使用C和putty编写客户端/服务器程序。 两个c文件都在同一个系统上。

我目前遇到的问题是将正在使用的帧写回客户端以及打印出我的帧。它打印出3 0 9 8,但随后开始打印出13456756等。

这就是我所拥有的:

服务器:

    #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>


    main (void)
    {
      int to_server;    // to read from client
      int from_server;  // to write to client
      int finish;   // lets me know that client is done
      int i,j,k,m,l;    // because C needs this defined as int
      int numClient;// number of clients
      char temp[14];
      int page_size = 128;
      int pages_left;
      int max_frames=10;
      int used_frames =0;
      int frameUpdate=0;
      int freeframe[10] = {3,0,9,8,7,5,1,4,2,6};  //this is the array 
      int numpage=0;
      int frames;
      int check;
      int option;
      int byte;
      int getPage;
      int getOffset;
      int physical_Addr;
      int offset;
      int req[3];
      int again;

      struct values{
          char privFifo[14];
          int memoryreq;
      }cinput;


      /* Create the fifos and open them  */
      if ((mkfifo("FIFO1",0666)<0 && errno != EEXIST))
        {
        perror("cant create FIFO1");
        exit(-1);
        }
      if((to_server=open("FIFO1", O_RDONLY))<0){
           printf("cant open fifo to write");
      }

      //get number of clients
      printf("\nHow many clients?\n");
      scanf("%d", &numClient);

      for(j =1; j <= numClient; j++){
          read(to_server, &cinput, sizeof(cinput));
          printf("\n\nFifo_%d \nMemory request %d", &cinput.privFifo, cinput.memoryreq);
          req[j-1] = cinput.memoryreq;
          if((mkfifo(cinput.privFifo,0666)<0 && errno != EEXIST))
           {
            perror("cant create privFifo");
            exit(-1);
          }

          if((from_server=open(cinput.privFifo, O_WRONLY)<0)){
                  printf("cant open fifo to write");
          }

          // find number of pages need for request
          numpage = cinput.memoryreq/page_size;

          if((numpage * page_size) < cinput.memoryreq){
            numpage++;
          }

          sleep(1);
          printf("\nPages needed %d", numpage);
          write(from_server, &numpage, sizeof(numpage));

          printf("\n******Main Memory******");
          for(m = used_frames; m < numpage; m++){
          printf("\n* client: %d\tframe: %d", j, freeframe[m]);
          frames = freeframe[m];
          write(from_server, &frames, sizeof(frames));
          }

          used_frames = max_frames - used_frames;
          pages_left = max_frames - numpage;

//this is where I try to print out the available frames
          printf("\n Frames available:");
          for(l = pages_left; l!= 0; l--){
                check = max_frames - l;
                printf(" %d", freeframe[check]);
                max_frames = check;
            }
          close(from_server);
          unlink(cinput.privFifo); 
      }

      printf("\nDONE!!!");
      close(to_server);
      unlink("FIFO1");

客户端:

#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>

main (void)
{
  int to_server;    // to write to server
  int from_server;
  char temp[14];    // server puts string here
  int clientID;
  //int frames;
  int numpage;
  int i;

struct values{
    char privFifo[14];
    int memoryreq;
}cinput;

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

  printf("writing data to to_server\n");
  printf("Client: Please enter number of memory units: ");
  scanf("%d", &cinput.memoryreq);
  printf("%d", cinput.memoryreq);
  clientID = getpid();
  sprintf(cinput.privFifo, "Fifo_%d", getpid());
  printf("\nFifo name is %s", &cinput.privFifo);
  write(to_server, &cinput, sizeof(cinput));//write client pid and memUnit to server
  sleep(2); //give time to send
  printf("\nClient: Got the character sent, now waiting for response ");

   if ((mkfifo(cinput.privFifo,0666)<0 && errno != EEXIST))
    {
    perror("cant create FIFO1");
    exit(-1);
    }
  if((from_server=open(cinput.privFifo, O_RDONLY))<0){
       printf("cant open fifo to write");
  }
  read(from_server, &numpage, sizeof(numpage));
  printf("\nFrames Occupied %d", numpage);

  close(to_server);
  close (from_server);
  unlink(cinput.privFifo);

  printf ("\nall done!\n");

}

非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

我强烈怀疑问题是行used_frames = max_frames - used_frames;。由于used_frames最初为0,因此在第二次迭代时将其设置为超出数组末尾的值,因此当您运行for(m = used_frames; m < numpage; m++)时,您将开始在帧数组的末尾打印值。 (顺便说一下:请妥善缩进。)但是设置断点并在调试器中运行以确保。