Отправка идентификатора процесса с клиента на сервер - PullRequest
0 голосов
/ 28 февраля 2020

Моя задача - написать клиентскую программу, которая записывает структуру с именем privateFIFO (FIFO_XXXX, где XXXX - это pid, который мы получаем из функции getpid ()) на сервер. Затем попросите сервер прочитать имя privateFIFO и написать сообщение обратно клиенту. т.е. прочитайте сообщение и распечатайте его на стороне клиента. У меня возникают проблемы при отправке FIFO_XXXX в серверную программу, а также при записи сообщения с сервера обратно клиенту.

client code:

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


int main (void)
{

  struct values
  {
    char privateFIFO[14];
    int intbuff;
  }input;

  int fda;  // common FIFO to read to write to server
  int fdb;      // Private FIFO to read from server
  int clientID;
  int retbuff;
  char temp[14];

  clientID = getpid();
  strcpy(input.privateFIFO, "FIFO_");
  sprintf(temp, "%d", clientID);
  strcat(input.privateFIFO, temp);
  printf("\nFIFO name is %s", input.privateFIFO);

  // Open common FIFO to write to server
  if((fda=open("FIFO_to_server", O_WRONLY))<0)
     printf("cant open fifo to write");

  write(fda, &input, sizeof(input));    // write the struct to the server
  close(fda);


  // Open private FIFO to read
  if((fdb=open(input.privateFIFO, O_RDONLY))<0)
     read(fdb, &retbuff, sizeof(retbuff));

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

  close(fdb);

}

server code:

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


struct values
  {
    char privateFIFO[14];
    int intbuff;
  }input;

int main (void)
{

  int fda;  //common FIFO to read from client
  int fdb;  //private FIFO to write to client
  int retbuff;
  int output;

// create the common FIFO 
  if ((mkfifo("FIFO_to_server",0666)<0 && errno != EEXIST))
        {
        perror("cant create FIFO_to_server");
        exit(-1);
 }

// open the common FIFO
  if((fda=open("FIFO_to_server", O_RDONLY))<0)
     printf("cant open fifo to write");


  output = read(fda, &input, sizeof(input));

// create the private FIFO
  if ((mkfifo(input.privateFIFO, 0666)<0 && errno != EEXIST))
  {
    perror("cant create privateFIFO_to_server");
    exit(-1);
  }


  printf("Private FIFO received from the client and sent back from server is: %d", output);

  //open private FIFO to write to client
  if((fdb=open(input.privateFIFO, O_WRONLY))<0)
    printf("cant open fifo to read");
  write(fdb, &retbuff, sizeof(retbuff));


  close(fda);
  unlink("FIFO_to_server");
  close(fdb);
  unlink(input.privateFIFO);


}


1 Ответ

0 голосов
/ 28 февраля 2020

Использовать IP C Очереди сообщений. Это лучше и проще. Действительно, этот механизм управляет синхронизацией между операциями чтения и записи, одновременным доступом, ...:

Процесс записи:

#include <stdio.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 

// structure for message queue 
struct mesg_buffer { 
    long mesg_type; 
    char mesg_text[100]; 
} message; 

int main() 
{ 
    key_t QueueKey; 
    int msgid; 

    // ftok : generate a unique OPC key 
    QueueKey = ftok("FIFO_XXXX", 65); 

    // msgget creates a message queue and returns identifier 
    msgid = msgget(QueueKey, 0666 | IPC_CREAT); 

    // Sending Data
    message.mesg_type = 1; 
    printf("Write Data : "); 
    gets(message.mesg_text); 

    // msgsnd : Send message to the queue
    msgsnd(msgid, &message, sizeof(message), 0); 

    // display the message 
    printf("Data send is : %s \n", message.mesg_text); 

    return 0; 
}   

Процесс чтения :

#include <stdio.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 

// structure for message queue 
struct mesg_buffer { 
    long mesg_type; 
    char mesg_text[100]; 
} message; 

int main() 
{ 
    key_t QueueKey; 
    int msgid; 

    // ftok to generate unique key 
    QueueKey = ftok("FIFO_XXXX", 65); 

    // msgget creates a message queue and returns identifier 
    msgid = msgget(QueueKey, 0666 | IPC_CREAT); 

    // msgrcv to receive message 
    msgrcv(msgid, &message, sizeof(message), 1, 0); 

    // display the message 
    printf("Data Received is : %s \n",  message.mesg_text); 

    // IPC_RMID : destroy the message queue 
    msgctl(msgid, IPC_RMID, NULL); 

    return 0; 
} 

Примечание:
Помните, что процесс может быть как записывающим, так и читающим. Для этого необходимо создать две очереди сообщений для каждого процесса. первое позволяет, например, получать, второе писать. Если вы действительно хотите разделить пространство для чтения / записи для каждого процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...