【问题标题】:Continuously merge one char array into another char array [duplicate]连续将一个char数组合并到另一个char数组中[重复]
【发布时间】:2020-01-22 19:32:51
【问题描述】:

我想在收到消息的同时不断地将small_buf 合并到big_buffer 中。我不知道该怎么做。

char small_buf[100];
char big_buffer[2048];
ssize_t bytes_r = 0;
while((bytes_r = recv(socket_fd,small_buf,sizeof(small_buf)-1,0)) > 0) {
     small_buf[bytes_r] = '\0';
     // now merge small_buf with big_buffer
}

big_buffer 表示从recv 以较小块的形式接收到的单个大消息。如何将所有 small_buf 合并到 big_buffer 中?

【问题讨论】:

  • 保持到目前为止收到的消息的长度。然后从该点开始复制新块。
  • 不需要复制。您应该直接在recv 中使用big_buffer,通过使用recv 的返回值来跟踪已经写入big_buffer 的数量。这样会更有效率。
  • @MickaelB。这对字符串有好处,但不适用于任意二进制数据
  • does not work 没有任何意义。 “不起作用”是什么意思?它是如何“不工作”的?发生什么了?什么不会发生?请尝试具体;)它使程序崩溃?程序永远不会退出?

标签: c arrays string char


【解决方案1】:

只需将数据接收到缓冲区中:

// the buffer to read the data to
char buffer[2048];
// position in buffer
size_t pos = 0;

for (
        // count of bytes received in this loop or error
        ssize_t received = 0; 
        ( 
             received = recv(socket_fd, 
                 // we are reading into position pos into the buffer
                 &buffer[pos],
                 // the size of buffer decreases each iteration
                 // leave space for zero terminating character `- 1`
                 // I assume that when `pos == sizeof(buffer) - 1` then `recv` will just return 0 or -1.
                 sizeof(buffer) - pos - 1,
                 0)
         # compare received > 0 
         ) > 0; 
         ) {
     // increase the position in buffer
     pos += received;
     // optionally: add `if (pos == sizeof(buffer) - 1) break;`         
     // also assert that all received characters are isprint()
}
// zero terminate the buffer, if you want to
// otherwise remove the `-1` above
buffer[pos] = '\0';

并且没有 cmets:

char buffer[2048];
size_t pos = 0;
for (ssize_t received = 0; 
         ( received = recv(socket_fd, &buffer[pos], sizeof(buffer) - pos - 1, 0)) > 0; 
         ) {
     pos += received;
}
buffer[pos] = '\0';

printf("Received %zu characters: `%.*s`\n", pos, (int)pos, buffer);

终止条件是序列\r\n\r\n有没有办法检测到这个?

char buffer[2048];
size_t pos = 0;
while (7) { // lucky 7!
    const ssize_t received = recv(socket_fd, &buffer[pos], 1, 0);
    // handle error
    // TODO: for example handle EINTR here
    if (received < 0) {
       break;
    }
    // handle empty loop
    if (received == 0) {
       continue;
    }

    // increment position in buffer
    assert(received == 1);
    pos += 1;
    // zero terminate the buffer
    assert(pos < sizeof(buffer));
    buffer[pos] = '\0';

    // if we have more then 4 characters, check for ending sequence
    if (pos >= 4) {
       if (memcmp(buffer[pos - 4], "\r\n\r\n", 4) == 0) {
           // sequence \r\n\r\n found
           break;
        }
    }

    // check for no more memory
    if (pos == sizeof(buffer) - 1) {
        // no more memory
        break;
    }
}

【讨论】:

  • 为什么不(received = recv(socket_fd, &amp;buffer[pos], sizeof(buffer) - pos - 1, 0)) &gt; 0
  • @S.S.Anne 我看到不习惯以这种方式使用逗号的人感到困惑。我会编辑它。
  • 大声笑。两者都很丑:)
  • @KamilCuk 我知道逗号,但我提出的解决方案是二合一。我想没关系,反正还是会生成同样的代码。
  • @amanda ` char buf[2048]; ssize_t res; size_t bytes=0, spaceLeft = sizeof(buffer)-1; while((res = recv(socket_fd, buf+bytes, spaceLeft, 0)) > 0) { bytes += res;空格左-=res; } // 管理套接字关闭! // ... // 在接收到的数据是字符串时很有用 buf [bytes] = 0; `
猜你喜欢
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2016-03-07
  • 1970-01-01
相关资源
最近更新 更多