Sto provando a scrivere semplici programmi client e server C, comunicando tra loro in terminali separati.Connessione client-server FIFO corretta
Il server deve creare un pubblico fifo e attendere il client. Nel frattempo il cliente sta creando il proprio fifo attraverso il quale verrà la risposta del server. L'attività del client invia al server un nome creato dalla coda e ottiene in risposta il risultato del comando ls
.
Ho cercato una risposta, ad esempio: fifo-server-program, example-of-using-named-pipes-in-linux-bash, how-to-send-a-simple-string-between-two-programs-using-pipes. Ho iniziato con il codice dal terzo link e lo ho modificato lentamente.
Quello che ho ora, è un client che riceve input dall'utente, lo invia al server e lo riceve indietro. Ma funziona solo una volta. Non ho idea del perché. Il corpo della funzione principale è sotto. Sarò grato per qualsiasi aiuto.
MODIFICA: Ho funzionato! : D I codici sono sotto, forse aiuterà qualcuno.
Il codice server.c:
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char* argv[])
{
int fds[2];
char tab[BUFSIZ];
int fd, n;
char *myfifo = "/tmp/serwer";
char *myfifo2 = "/tmp/client";
pipe(fds);
mkfifo(myfifo,0666);
while(1)
{
fds[0]=open(myfifo2,O_RDONLY);
fds[1]=open(myfifo,O_WRONLY);
read(fds[0],tab,BUFSIZ);
if (strcmp("klient",tab)==0) {
printf("Od klienta: %s\n",tab);
fd=open(tab,O_WRONLY);
if(fork()==0)
{
dup2(fds[1],1);
close(fds[1]);
execlp("ls","ls","-l",NULL);
close(fds[0]);
close(fds[1]);
}
else
{
dup2(fds[0],0);
n = read(fds[0],tab,BUFSIZ);
write(fd,tab,n);
close(fds[0]);
close(fds[1]);
}
}
memset(tab, 0, sizeof(tab));
close(fd);
close(fds[0]);
close(fds[1]);
}
unlink(myfifo);
return 0;
}
Il codice client.c:
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char* argv[])
{
int fds[2];
char *myfifo = "/tmp/serwer";
char *myfifo2 = "/tmp/client";
mkfifo(myfifo2,0666);
fds[0]=open(myfifo,O_RDONLY);
fds[1]=open(myfifo2,O_WRONLY);
char tab[BUFSIZ];
memset(tab, 0, sizeof(tab));
write(fds[1],"klient",6);
perror("Write:"); //Very crude error check
read(fds[0],tab,sizeof(tab));
perror("Read:"); // Very crude error check
printf("Odebrano od serwera: %s\n",tab);
close(fds[0]);
close(fds[1]);
unlink(myfifo2);
return 0;
}
Non è chiaro da questo codice. Hai ottenuto l'output ls o stai solo inviando piccoli msg? La solita trappola in questo scenario è che ti trovi in una condizione di stallo, il server è in attesa di input mentre il client è in attesa di input. Aspettano per sempre perché nessuno sta inviando nulla. – Duck
No, il comando ls non funziona ancora. Questi programmi funzionano una volta: il server attende un messaggio, lo restituisce al client, il client può chiudersi. Quando voglio inviare un altro messaggio, sia il client che il server non rispondono. – uluroki