2017-04-22 1 views
-2

Ich habe ein Problem in meinem Programm. Ich lese von stdin in endless loop es funktioniert gut, aber wenn ich mehr als 4096 Zeichen in stdin es fängt an, schlecht zu handeln ich nicht wirklich warum. ist getc begrenzt? Ich gebe ich Ihnen hier Eingang und Ausgang dor setzen ilustrationFehler, wenn getc liest mehr als 4096 Zeichen

#define NFDS 1 
#define h_addr h_addr_list[0] 
#define BUFFER_LEN 4096 
void *sending(void *arguments) 
{ 
struct arg_struct *args = arguments; 
      int i = 0, j = 1; 
      if(signal(SIGINT, receive_signal) == SIG_ERR) { 
         fprintf(stderr, "Error setting signal handler for SIGINT.\n"); 
        } 
      fd_set myset; 
      struct timeval tim; 
      int result; 
      int data_cap = 4096; 
      while(running) 
      { 
       tim.tv_sec = 0; 
       tim.tv_usec = 500; 
       FD_ZERO(&myset); 
       FD_SET(STDIN_FILENO, &myset); 
       result = select(STDIN_FILENO + 1, &myset, NULL, NULL, &tim); 
       if(result != 0) 
       { 
         str = calloc(data_cap,sizeof(char)); 
         while((c = getc(stdin)) != '\n') 
         { 
          if (j >= data_cap) 
          { 
           str = realloc(str,sizeof(char) * data_cap * 2); 
           data_cap = data_cap * 2; 
          } 
          str[i] = c; 
          i++; 
          j++; 
         } 
         if (j >= data_cap) 
         { 
          str = realloc(str,sizeof(char) * data_cap * 2); 
         } 
         str[i] = '\0'; 
         if(strlen(str)!=0) 
         { 
          bufferIn = message(args->arg2,str); 
           if(send(args->arg1,bufferIn,strlen(bufferIn),0) < 0) 
          { 
           callError("ERROR: cannot send socked"); 
          } 
          free(bufferIn); 
         } 
         free(str); i = 0; j = 1; data_cap = 4096;   
       } 
      } 
return NULL; 
} 

//in main threads 
    struct arg_struct args; 
    args.arg1 = client_socket; 
    args.arg2 = username; 
pthread_t t22; 
pthread_t t11; 
pthread_create(&t22, NULL, &sends, (void *)&args); 
pthread_create(&t11, NULL, &reci, (void *)&args); 
pthread_join(t22, NULL); 
    pthread_cancel(t22); 
pthread_join(t11, NULL); 
pthread_cancel(t11); 

Eingang zum Beispiel: AAAAAAAA ..... aaaaaaaaa DIES IST DAS WORT

lässt sich vorstellen, dass es 4096 ‚a‘ Zeichen in einer Sequenz von der ersten ‚a‘ ‚a‘ zu halten, aber wenn ich drucken, was ich von stdin bekam ich dieses:

dIES DER AAAAAAA WORD IST ...... AAAAAAA dIES IST dAS WORT

was es ist wirklich zuerst, es liest alle Zeichen f orm 4096. char. In diesem Beispiel ist es "DIESES IST DAS WORT" und druckt es zuerst. Dann druckt es wirklich, was es an erster Stelle drucken soll.

zwischen allen Zeichen in keinem Ende der Zeile Symbol zunächst dachte ich, dass es etwas Schlechtes mit Speicherzuweisung ist, weil ich Mamory bei 4096 Bytes zuordnen, aber es gibt nicht. Ich habe es getestet. Thak Sie für jede Hilfe Entschuldigung für schlecht Englisch

+5

Gibt es etwas falsch mit Ihrem spacebar? Die Einrückung ist überall –

+0

Es gibt ein oben definiertes Makro mit der Bezeichnung 'BUFFER_LEN' welches einen Wert von 4096 hat. Dies wird verwendet, um ein Char-Array der Größe 4096 zu definieren. Könnten Sie überlaufen? –

+4

Könnten Sie bitte nur die relevanten Teile des Codes zeigen? Es ist schwer, so viel Code zu lesen, wenn das eigentliche Problem in einem viel kleineren Codeblock liegt. – dasblinkenlight

Antwort

0

Dies ist mehr ein Kommentar, dass eine Antwort, aber wie es lang ist, ich habe es hier so wie es geschrieben.

Etwas anderes muss falsch sein, weil die „problematischen“ -Teil als Isolierung:

char c; 
    int i=0, j=1, data_cap=4096; 
    char *str = calloc(data_cap,sizeof(char)); 
    while((c = getc(stdin)) != '\n') { 
    if (j >= data_cap) { 
     str = realloc(str,sizeof(char) * data_cap * 2); 
     data_cap = data_cap * 2; 
    } 
    str[i] = c; 
    i++; 
    j++; 
    } 
    if (j >= data_cap) { 
    str = realloc(str,sizeof(char) * data_cap * 2); 
    } 
    str[i] = '\0'; 
    if(strlen(str)!=0) { 
    char *bufferIn = message("test",str); 
    printf("%s\n",bufferIn); 
    free(bufferIn); 
    } 
    free(str); i = 0; j = 1; data_cap = 4096;   

funktioniert gut.

Wie Sie uns nicht gesagt hat, was das Argument an die Funktion sind, können wir nicht mehr sagen ...

+0

iam Verwendung in diesem Programm asynchron. signal hadling mit paralel threads ich denke das könnte ein problem sein. da Sie nicht die Funktion select oder den Signal-Handler verwenden, gibt es vielleicht ein Problem, aber haben Sie wirklich versucht, eine Eingabe mit einer Länge größer als 4096 einzugeben? – krakra

+0

Dann weißt du, war dein Problem ... Was macht dein 'receive_signal'? Verfolgen die Threads gleichzeitig die Eingabe? –

+0

nein sie sind nicht ein Thread überprüft Stdin und sendet Nachricht an Server der zweite Thread wartet auf Server zu senden Nachricht und whites in stdou und empfangen Signal prüfen, ob SIGINT gesendet wurde Break Zyklus und Ende ganzes Programm – krakra

Verwandte Themen