C++ 继续通过UDP发送数据的最佳方式,数据格式为C+中给定的数据格式(双精度、浮点、整数、1位布尔)+/Visual Studio?序列化?
我有数据,其中包括纬度和经度的32位缩放整数,x y和z速度的32位浮点,以及一些1位标志。我还成功地通过UDP发送了至少一个double,但在另一端和Wireshark中它似乎是垃圾。我需要逐位访问,以便在通过UDP发送数据时每秒切换/更改数据。消息格式很简单,每种数据类型都会占用它的大小,并且有一个特定的起始位。似乎我需要序列化,但另一方面,不一定要反序列化,这是可能的吗?我的第一个想法是创建一个包含所有数据的结构,然后通过UDP发送整个结构,但填充似乎是错误的。消息需要64字节长,并且每种数据类型都有一个起始位和格式长度。这段代码可以编译并工作,但接收端的纬度不可读取。Lat、long和alt每秒更新一次。有更多的数据字段,但我尝试从小的开始。该格式的代码段随附数据类型、字位置、该字内的起始位,并随附以位为单位的长度,lat、long和alt位于消息的其他位置。现在最好的办法是使用谷类食品(),但不确定这是否是一条死胡同C++ 继续通过UDP发送数据的最佳方式,数据格式为C+中给定的数据格式(双精度、浮点、整数、1位布尔)+/Visual Studio?序列化?,c++,serialization,udp,cereal,C++,Serialization,Udp,Cereal,我有数据,其中包括纬度和经度的32位缩放整数,x y和z速度的32位浮点,以及一些1位标志。我还成功地通过UDP发送了至少一个double,但在另一端和Wireshark中它似乎是垃圾。我需要逐位访问,以便在通过UDP发送数据时每秒切换/更改数据。消息格式很简单,每种数据类型都会占用它的大小,并且有一个特定的起始位。似乎我需要序列化,但另一方面,不一定要反序列化,这是可能的吗?我的第一个想法是创建一个包含所有数据的结构,然后通过UDP发送整个结构,但填充似乎是错误的。消息需要64字节长,并且每种
struct TSPIstruct //
{
double Latitude;
double Longitude;
double Altitude;
};
void SendDataUDP(double latitude, double longitude, double altitude)
{
TSPIstruct TSPI;
TSPI = CompileTSPI(latitude, longitude, altitude);
//printf("\n\r");
printf("Sending GPS over UDP at %d", LastSystemTime);
printf("\n\r");
printf("\n\r");
//send the message
if (sendto(s, (char*)&(TSPI.Latitude), sizeof(double) , 0 , (struct sockaddr *) &si_other, slen) == SOCKET_ERROR)
{
printf("sendto() failed with error code : %d" , WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("UDP packet sent, latitude is %f", TSPI.Latitude);
printf("\n\r");
printf("\n\r");
}
TSPIstruct CompileTSPI(double latitude, double longitude, double altitude)
{
TSPIstruct TSPI;
TSPI.Latitude = latitude;
TSPI.Longitude = longitude;
TSPI.Altitude = altitude;
return TSPI;
}
可能是一个愚蠢的问题,但是当发送二进制数据时,你不仅要考虑填充/对齐,还要考虑位排序。 如果您确定µp ArtiStructure两侧相同,则可以跳过后一点。在TCP中,自古以来他们就添加了:
uint32_t htonl(uint32_t host32bitvalue) ;
等等
如果您在同一台本地计算机(即127.0.0.1)上进行尝试,它是否工作?粘贴客户端和服务器代码。。我将在Unix和windows下尝试
:)我将尝试此方法,尽管我确信最终可以在Wireshark中看到其中一个值。由于对齐/填充,当消息中有3个浮点数或两个浮点数相邻时,我的问题就出现了。我希望能够看到UDP消息中特定位位置的所有数据,并且能够肯定地说,是的,32或64位是我纬度的浮点数,因为我把它们放在那里了。序列化能解决这个问题吗?序列化是另一个概念。(通常在OOP中…)无论如何,如果使用结构,您将与32位或64位对齐(取决于编译器)。您可以尝试使用#pragma align,这在这些情况下很有用。如果您尝试发送一个完整的结构,它能工作吗?