2017-04-22 3 views
-2

私のプログラムに問題があります。私は無限ループでstdinから読んでいます。うまくいきますが、4096文字以上の文字をstdinに入れると、それは悪い動作を始めます。本当になぜですか。 getcは制限されていますか?私は、私は、例えば、入力と出力DOR Ilustrationによってにここgetcが4096を超える文字を読み取るとエラーが発生します

#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); 

入力をあなたを配置します:aaaaaaaaを..... aaaaaaaaaこれは、シーケンス内の4096「」文字があることを想像することができますWORD

IS 「」「」 を最後から最初が、私はこれを取得する標準入力から得たもの印刷するとき:

これはWORD AAAAAAA IS ......これはWORD

何ですかAAAAAAAそれは本当に最初です、それはすべての文字を読むf orm 4096. char。この例では、これは「これは言葉です」と最初に印刷します。最初の場所で印刷すべきものを実際に印刷するよりも。

行末にない文字の間には、最初に があります。私は4096バイトでmamoryを配置しているため、メモリ割り当てに問題があります。私はそれをテストしました。 あなたのお手伝いがあります 悪い英語で申し訳ありません

+5

スペースバーに問題がありますか?インデントは全面にあります –

+0

上記で定義した 'BUFFER_LEN'という名前のマクロには値4096があります。これはサイズ4096のchar配列を定義するために使用されます。オーバーフローすることはできますか? –

+4

コードの関連部分のみを表示してください。実際の問題がはるかに小さなコードブロック内にある場合、非常に多くのコードを読むのは難しいです。 – dasblinkenlight

答えて

0

これはコメントですが、長い間私はここに掲載しました。

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;   

がうまく機能:として「問題」の部分を分離するため、他の

何かが間違っていなければなりません。

関数の引数が何であるかを教えてくれなかったので、私たちはもっと具体的に言えません...

+0

iamはこのプログラムで非同期を使用しています。 paralelスレッドで信号を送ると、私はthareが問題になるかもしれないと思います。選択機能やシグナルハンドラを使用していない可能性がありますが、おそらく問題がありますが、実際に長さが4096より大きい入力を試しましたか? – krakra

+0

あなたの問題は...あなたの 'receive_signal'は何をしていますか?同時読み込みを行っているスレッドが入力を読み込んでいますか? –

+0

いいえ1つのスレッドではないstdinをチェックしてサーバーにメッセージを送信する2番目のスレッドがサーバーにメッセージとワートをstdouに送り、SIGINTがブレイクサイクルに送信されたかどうかを確認するメッセージを受信するのを待機している – krakra

関連する問題