NamedPipe mit ms-Zugriff hängt sporadisch

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
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:
Zurück