我目前正在学习使用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”转换为字符串,以便我可以使用String.Split(“”)来获取命令和文件名。
有人可以解释一下将“void * buff”转换成字符串的方法吗?
答案 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函数可能会帮助你得到你想要的东西。