2017-04-22 41 views
-2

我的程序中遇到問題。我正在從無限循環的標準輸入讀取它工作正常,但是當我把超過4096個字符寫入標準輸入時,它開始行事不好,我真的不知道爲什麼。是getc有限?我,我要把你在這裏輸入和輸出DOR ilustrationgetc讀取超過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這是WORD

讓我們來想象有4096序列中的「A」字符從第一個「一」持續「A」 但是當我打印從標準輸入我得到了什麼我得到這個:

這是WORD AAAAAAA ...... AAAAAAA這是WORD

什麼它確實是在第一次,它讀取所有字符f charm。4096. char。在這個例子中,它是「這是這個詞」並首先打印它。比它真正打印它應該首先打印的內容。

所有字符之間沒有行尾符號 在開始我有點不好的內存分配,因爲我分配內存在4096字節,但沒有。我測試了它。 泰克你的任何幫助 對不起,因爲英語

+5

是不是有什麼問題與您的空格鍵?縮進遍佈 –

+0

上面定義了一個名爲'BUFFER_LEN'的宏,其值爲4096.這用於定義一個大小爲4096的字符數組。可以溢出嗎? –

+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線程had,我認爲thare可能會有一些問題。因爲你沒有使用選擇函數或信號處理程序也許有問題,但你真的嘗試輸入的長度大於4096? – krakra

+0

然後你知道你的問題是......你的'receive_signal'做了什麼?線程是否在併發讀取輸入? –

+0

不,他們不是一個線程正在檢查標準輸入並向服務器發送消息第二個線程正在等待服務器發送消息和標記進入標準並接收信號檢查信號是否發送信號來中斷週期並結束整個程序 – krakra

相關問題