2016-06-02 19 views
0

Also versuche ich eine grundlegende FIFO-Pipeline in C mit mkfifo() zu implementieren. Hier sind meine Code Klassen so weit:FIFO-Pipelining-Server empfängt nur eine bestimmte Menge

main.c:

int main(int argc, char *argv[]) { 
char *path = "/tmp/fifo"; 
pid_t pid; 

setlinebuf(stdout); 
unlink(path); 
mkfifo(path, 0600); 

pid = fork(); 
if (pid == 0) { 
    client(path); 
} else { 
    server(path); 
} 

return(0); 
} 

client.c:

void client(char *path) { 

char *input; 
input = (char *)malloc(200 * sizeof(char)); 

read(STDIN_FILENO, input, 200); 

struct Message message; 
message = protocol(input); //protocol simply takes an input string and formats it 
char number = message.server; 
char* string; 
string = message.string; 

int fd; 

fd = open(path, O_WRONLY); 
write(fd, string, sizeof(string)); 
printf("Client send: %s\n", string); 
close(fd); 


return; 
} 

server.c:

void server(char *path) { 
int fd; 
char *input; 
input = (char *)malloc(200 * sizeof(char)); 

fd = open(path, O_RDONLY); 
read(fd, input, sizeof(input)); 
printf("Server receive: %s\n", input); 
close(fd); 

return; 
} 

Nun ist die Pipeline funktioniert, aber aus irgendeinem Grund empfängt der Server nur einen Teil der Nachricht. „HALLO WELT“ Wir erhalten die folgende Ausgabe:: Wenn wir zum Beispiel die folgenden Zeichenfolge aus dem Protokoll erhalten

Server receive: HELLO WO 
Client send: HELLO WORLD 

Der Server soll die gesamte Nachricht empfangen, aber es ist nicht. Was mache ich falsch? Danke für jede Hilfe!

+0

In server.c, warum 'input = (char *) malloc (200 * sizeof (char));' aber dann 'lesen (fd, input, MAX_BUF);' wenn 'MAX_BUF' 1024 ist? –

+0

Oh, ich habe verschiedene Dinge ausprobiert, und beide, die MAX_BUF oder sizeof (input) hatten, gaben mir die gleiche Ausgabe. Ich glaube, ich habe vergessen, es wieder in etwas Konsequentes zu verwandeln! ^^; – k1234

Antwort

1

Ich habe bemerkt, dass Sie die normalerweise notwendige Überprüfung der Rückgabewerte von open und read und write übersprungen haben. Wenn Sie haben, haben Sie den Fehler in dieser Zeile bemerken

write(fd, string, sizeof(string)); 

Da string ein Zeiger ist, senden Sie 8 Bytes (die Größe des Zeigers). Sie sollten strlen(string) oder +1 verwenden, abhängig davon, ob der Terminator gesendet werden muss.

write(fd, string, strlen(string)); 

Sie wiederholen den Fehler in der letzten unklug edit:

read(fd, input, sizeof(input)); 

Sie würden besser Haften mit dem ursprünglichen #define sein und die Verwendung dieser für beide Pufferzuweisung und Anforderungsgröße lesen.

+0

Vielen Dank! Ich bin immer noch sehr neu in C. Mit strlen und zurück zu meinem vorherigen MAX_BUF habe es geschafft !! – k1234

+0

Bitte versuchen Sie, in-line hartcodierte magische Zahlen zu vermeiden - beziehen Sie sie immer aus einer einzigen Definition. –