2017-04-22 158 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

相关问题