【问题标题】:recv()-ing a String with "\0" and "\n" in itrecv() - 包含“\0”和“\n”的字符串
【发布时间】:2021-12-26 01:24:39
【问题描述】:

所以编写了一个客户端,它只接收缓冲区中的字符,然后我打印出来:

//CODE FROM BJ'S GUIDE TO NETWORK PROGRAMMING *1
if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
        perror("recv");
        exit(1);
    }

    buf[numbytes] = '\0';

    printf("%s",buf);
//MY CODE
    while (numbytes > 0) {
        numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0);
        if (numbytes > 0) {
            buf[numbytes] = '\0';
            printf("\%s",buf);
        }
    }

buf 是一个 char[512] 数组

我还想 recv() "\0" 和 "\n" 并将它们打印为 "\0" 和 "\n"

代码如下所示

printf("this contains a \\n byte and a \\0 byte");

我无法更改服务器端的内容,因为我必须编辑接收端

*1:https://beej.us/guide/bgnet/

【问题讨论】:

  • 如果缓冲区可以包含多个\0 字节,则它不是字符串,不能只使用字符串函数。您必须将其视为内存缓冲区并使用numbytes 变量对其进行处理。一种方法是一次只读取一个字符,并尽可能按字面输出该字符,或根据需要转义。
  • 您可以使用memchr() 来查找'\0' 值字节。
  • recv 不会为您提供以空字符结尾的字符串。它为您提供一个字节缓冲区和一个单独的计数,告诉您有多少字节。因为它不是一个字符串,所以你不能用普通的 C 字符串处理函数来打印它,比如printf%s。您可以使用fwrite(buf, 1, numbytes, stdout); 将其打印到屏幕上。
  • 在您的上下文中,“numbytes”在进入循环之前未分配任何值。如果它最初大于 0 怎么办?为什么不像 Beej 那样在 while () 表达式中插入 recv()?而且 recv() 也不会返回上面提到的字符串。您不应将最后收到的字节替换为 '\0'。
  • while ((numbytes = recv(sockfd, buf, MAXDATASIZE, 0) > 0) {

标签: c network-programming printf


【解决方案1】:

我还想 recv() "\0" 和 "\n" 并将它们打印为 "\0" 和 "\n"

不要在buf 上使用字符串 函数。将其作为字符数组处理。

while (numbytes > 0) {
  numbytes = recv(sockfd, buf, MAXDATASIZE, 0);
  for (i = 0; i < numbytes; i++) {
    unsigned char ch = buf[numbytes];
    if (ch <= '\n') {  // Escape characters 0 to 13
      putc('\\');
      putc("0123456abtrvfn"[ch]);
    } else if (ch == '\\') {  // I suspect OP will also want this
      putc('\\');
      putc('\\');
    } else {
      putc(ch); 
    }
  }
}

【讨论】:

    【解决方案2】:

    好的,我们像这样使用fwrite() 做到了

        fwrite(buf, numbytes, sizeof(char), stdout);
    

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 2021-06-17
      • 2011-05-29
      • 2011-03-10
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2011-02-17
      相关资源
      最近更新 更多