我正在从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.因此我的问题。
答案 0 :(得分:1)
我假设您可以访问服务器和客户端代码。
您说您知道邮件的大小,因此您可以在发送邮件之前准备好邮件,查找任何\0
字符并替换为替换为唯一字节序列在客户端识别,用原始字符替换它。
答案 1 :(得分:1)
如果问题是由直接将整数转换为字符数组并发送它们引起的,那么我建议将整数写入ostringstream(可在C ++标准库中找到),通过调用ostringstreams str()方法提取整数,然后通过套接字发送格式化的字符串。这将为您提供整数的字符表示,并应修复任何格式问题。