【问题标题】:Receiving data from stream continuously and reading stream连续从流中接收数据并读取流
【发布时间】:2013-12-21 17:16:43
【问题描述】:

我正在接收字符串并将其保存到输入缓冲区。这是流,字符串可能不完整,所以我正在寻找最后一个 STOP - 字符串,复制其余部分(这是下一个块的开始)并将下一次交付的数据附加到复制的数据后面。
在这期间,我对输入缓冲区进行了一些操作(如 memcpy)。我应该复制输入缓冲区还是可以使用我拥有的 input_buffer?

有人告诉我,这是没有意义的:

 if ( bytes_received == 0 ) {
      continue;
    }

但这是流。如果这没有任何意义,我如何保证我会持续接收数据?

char * strrstr(char *string, char *find, ssize_t len)
{

  char *cp;    
  for (cp = string + strlen(string) - 4; cp >= string; cp--)
  {
    if (strncmp(cp, find, 4) == 0)
    return cp+4;
  }
  return NULL;
}

int main ( void ) {
  char * input_buffer = malloc(MAXLENGTH);
  size_t restSize=0;
  char * restP;

  int socket_handle = reqData(subStr);
  ssize_t bytes_received ;
  for (;;) {

    bytes_received = recv ( socket_handle , input_buffer+restSize ,MAXLENGTH-1, 0 ) ;

    input_buffer[bytes_received-1] = '\0';
    if ( bytes_received == -1 ) {
      printf ( "-1 An error occured during the receive procedure \n" ) ;
      return 0 ;
    }
    if ( bytes_received == 0 ) {
      printf ( "0 An error occured during the receive procedure \n" ) ;
      return 0 ;
    }
    restP = strrstr (input_buffer, STOP, 4);
    if (restP == NULL)
    {
      restSize = 0;
      continue;
    }
    restSize = strlen(restP);//MAXLENGTH - (restP - input_buffer) + 1;
    processXML(input_buffer, restP, t);
    strcpy(input_buffer,  restP);

  }
  close(socket_handle);
  free (input_buffer);
  return 0 ;
} 

【问题讨论】:

    标签: c


    【解决方案1】:

    你的代码有一些错误:

    1. 这里:input_buffer[bytes_received-1] = '\0'; 您不检查 bytes_recived 是否为 -1(稍后再检查)。此外,您必须检查它是否为 0,因为不允许数组的负索引。以后也这样做,所以只需移动引用的行。

    2. 考虑使用 string.h 中的 strstr 函数而不是 strrstr。即使您的实现看起来不错(如果这是一个很好的练习,如果这是它的目的),还是建议使用标准函数,因为它们比您的实现更安全,例如可能隐藏一些错误。

    3. 调用 recv 函数时,无需期待 MAXLENGTH-1。 MAXLENGTH 也可以。

    现在,回答您的问题,这可能有用:recv() returns 0 如您所见,当 recv 返回 0 时,不再期待输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 2016-05-15
      • 2016-11-12
      • 2016-08-04
      • 2010-12-08
      • 2016-01-11
      • 2011-11-19
      相关资源
      最近更新 更多