【发布时间】:2016-11-10 10:27:29
【问题描述】:
我正在从 C 中的套接字读取可变字节消息。但是当任何消息中的某个字节为 \0 时,就会出现问题。它分为两部分,只发送前半部分。客户端也有接收问题。
请建议任何格式,我可以使用。
一个解决方案,我有是先发送消息的大小,然后发送消息的其余部分。这样可以解决问题,但处理变得复杂。
我正在寻找其他更清洁的解决方案?
/**
Send data to the connected host
*/
bool send_data(const char* data) {
//Send some data
if (sendto(sock, data, strlen(data), 0,
(const struct sockaddr *) &server, length) < 0) {
perror("Send failed ");
return false;
}
std::cout << "Data sent: length=" << strlen(data) << " \n";
char str[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(server.sin_addr), str, INET_ADDRSTRLEN);
std::cerr << "server.sin_addr=" << str << std::endl;
return true;
}
/**
Receive data from the connected host
*/
void receive(char * buffer, size_t size) {
//Receive a reply from the server
if (recvfrom(sock, buffer, size, 0, (struct sockaddr *) &from, (socklen_t*) & length) < 0) {
puts("recv failed");
}
char str[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(from.sin_addr), str, INET_ADDRSTRLEN);
std::cerr << "from.sin_addr=" << str << std::endl;
}
我发送的数据只是转换为char * 的整数。好吧,有些整数很小,所以高字节大多是 00000000。因此我的问题。
【问题讨论】:
-
你发送的数据是文本还是二进制?如果您发送二进制数据,则不能使用文本函数(例如
strlen)。如果没有看到任何代码,最好是Minimal, Complete, and Verifiable Example。 -
“分成两部分,只发送前半部分”。为什么你不认为那是因为你的代码不正确?因为如果你有正确的代码,你当然可以发送和接收带有
\0的消息。但是看不到代码就无法指出问题所在。 -
strlen(data)是你的问题。正如已经指出的那样,如果您的数据是二进制的(如果您想在其中包含\0s),则不能使用任何字符串函数。一种可能的解决方法是让send_data函数采用长度参数。 -
"我发送的数据只是转换为 char * 的整数"。该更新只是确认您的数据非常二进制而不是文本。您不得在其上使用字符串函数。而且我看不出先发送尺寸有什么复杂之处。这是一种非常标准的操作方式。
-
我认为先发送尺寸会很简单。
标签: c++ algorithm sockets sendmessage