#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 для чтения?