Andre_Java
Mitglied
Ich möchte per Namedpipe alle ca. 10 ms Daten von einem Client zu einem Server-Prozess austauschen. Prinzipiell funktioniert das, nur sporadisch gehen Daten verloren, wodurch beide Programme im "Deadlock" sind und gleichzeitig warten.
Der Read-Befehl ist blockierend. Wieso gehen hier Daten verloren? Was kann ich tun, damit der Empfang 100%ig sichergestellt wird? Dabei darf die Zeit auch ruhig größer werden. Durch das Einfügen von Pausen vor den Read -und Write-Befehlen werde die Ausfälle weniger.
Programmiersprache: C unter Linux (gcc)
server.c
client.c
Der Read-Befehl ist blockierend. Wieso gehen hier Daten verloren? Was kann ich tun, damit der Empfang 100%ig sichergestellt wird? Dabei darf die Zeit auch ruhig größer werden. Durch das Einfügen von Pausen vor den Read -und Write-Befehlen werde die Ausfälle weniger.
Programmiersprache: C unter Linux (gcc)
server.c
Code:
int main(int argc, char *argv[])
{
int i=0;
ret_val = mkfifo(NP1, 0666);
if ((ret_val == -1) && (errno != EEXIST)) {
perror("Error creating the named pipe");
exit (1);
}
ret_val3 = mkfifo(NP3, 0666);
if ((ret_val3 == -1) && (errno != EEXIST)) {
perror("Error creating the named pipe");
exit (1);
}
while( 1 )
{
//Client1 Anfrage senden, damit Werte geschickt werden
writepipe1 = open(NP3, O_RDWR,0);
write(writepipe1, w_buf1, strlen(w_buf1));
close(writepipe1);
//Client1 empfangene Werte auslesen
readpipe1 = open(NP1, O_RDONLY);
numread = read(readpipe1, buf1, MAX_BUF_SIZE);
if( numread == 0 )
printf("\nEOF1-Fehler\n");
else if( numread < 0 )
printf("\nIO1 Error\n");
else
{
buf1[200] = '\0';
strcpy(Ergebnis1, buf1);
}
close(readpipe1);
strcpy(buf1,"\0");
} //while
} //main
client.c
Code:
int main(int argc, char *argv[])
{
while(1)
{
readpipe3 = open(NP3, O_RDONLY);
numread3 = read(readpipe3, r_buf, sizeof(r_buf));
close(readpipe3);
if ( strcmp( r_buf, Anfrage1 ) == 0 ) // Gültige Anfrage erhalten
{
//Uhrzeit vom System holen
gettimeofday(&tv,NULL);
time1 = (tv.tv_sec);
time3 = (tv.tv_usec / 1000);
timestamp_ms = time1 * 1000 + time3;
sprintf(buffer, "%13.0f", timestamp_ms);
printf("\nClient1 Daten wurden angefragt: %s\n", buffer);
writepipe1 = open(NP1, O_WRONLY); // Sende Uhrzeit an Server
write(writepipe1, buffer, strlen(buffer));
close(writepipe1);
}
else
printf("\nFehler in Anfrage: %s\n", r_buf);
strcpy(r_buf,"\0");
} //while
} //main
Zuletzt bearbeitet: