代码之家  ›  专栏  ›  技术社区  ›  Michael Sync

recvfrom-如何将缓冲区转换为字符串

c
  •  2
  • Michael Sync  · 技术社区  · 16 年前

    我现在正在学习用C/C++进行网络编程…我有.NET的经验,但不懂C(特别是Unix网络编程)

    我现在面临的问题是,当我收到信息时,我喜欢把它分成两部分。消息的格式如下 [command] filepath get a.txt 或 put a.txt )

    我正在使用recvform接收消息。

    int recvfrom(int sockfd, void *buf, int len, unsigned int flags,
                 struct sockaddr *from, int *fromlen);
    

    问题是我不知道如何将“void*buff”转换成字符串,这样我就可以字符串。拆分(“”)以获取命令和文件名。

    有人能给我解释一下把“void*buff”转换成字符串的方法吗?

    3 回复  |  直到 16 年前
        1
  •  2
  •   Jonathan Leffler    16 年前

    实际上,将指针作为缓冲区传递到字符数组的开头。这个 recvfrom() 系统调用写入该数组。然后将数组作为字符串进行处理—在确保它正确地以null结尾(这是 不会的)。当然,发送端必须将数据以兼容的格式放入,但是 recvfrom() 会给你寄信人寄给你的东西。

    所以,直接的答案是“你不转换 void * 无效* 把它传给

        2
  •  1
  •   Zan Lynx    16 年前

    您需要一个字符缓冲区和缓冲区的大小。这样地:

    char buf[1024];
    const size_t buf_len = sizeof(buf);
    

    ssize_t r;
    r = recvfrom(sock, buf, buf_len-1, flags, &sock_from, &sock_from_len);
    if(r<0) {
      handle_error(r);
    } else if(r == 0) {
      handle_closed_socket(sock);
    } else {
      buf[r] = '\0';
    }
    

    这个 buf[r] = '\0'; buf 就像一根绳子。

        3
  •  0
  •   nmichaels    16 年前