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

时间:2010-08-30 16:43:11

标签: c

我目前正在学习使用C / C ++进行网络编程...我有经验.NET而不是C(特别是在Unix网络编程中)

我现在面临的问题是,当我收到消息时,我想把它分成两部分。消息格式类似于[command] filepath(例如:get a.txtput a.txt

我正在使用recvform来接收消息。

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

问题是我不知道如何将“void * buff”转换为字符串,以便我可以使用String.Split(“”)来获取命令和文件名。

有人可以解释一下将“void * buff”转换成字符串的方法吗?

3 个答案:

答案 0 :(得分:1)

实际上,您将指针作为缓冲区传递给字符数组的开头。 recvfrom()系统调用写入该数组。然后,您可以将数组作为字符串处理 - 确保它正确地为空终止(recvfrom()不会执行)。当然,发送端必须以兼容格式放置数据,但recvfrom()将为您提供发件人发送给您的内容。

因此,直接答案是“您没有将void *转换为字符串;您可以通过将字符串传递给void *来将其转换为recvfrom()。” / p>

答案 1 :(得分:1)

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

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

然后你可以像这样调用recvfrom:

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';将保证您的缓冲区是一个正确的以null结尾的C字符串。然后你可以将buf作为字符串传递给你。

答案 2 :(得分:0)

C不是C ++。没有字符串类。假设你手动终止缓冲区,strtok函数可能会帮助你得到你想要的东西。