在C++/Visual Studio中,通过给定数据格式(doubles、float、int、1位bools)的UDP发

Best way to proceed to send data over UDP having the data format given (doubles, floats, ints, 1 bit bools) in C++/Visual Studio? Serialization?

本文关键字:int float 1位 doubles bools UDP 数据格式 Studio Visual C++      更新时间:2023-10-16

我有数据,其中包括纬度和经度的32位缩放整数,x y和z速度的32位浮点,以及一些1位标志。我也成功地通过UDP发送了至少一个double,但它在另一端和Wireshark中似乎是垃圾。我需要逐位访问,以便在UDP上发送数据的每一秒切换/更改数据。消息格式很简单,每种数据类型都会占用其大小,并有一个特定的起始位。我似乎需要序列化,但对于另一端,不一定要反序列化,这可能吗?我的第一个想法是用所有数据创建一个结构,然后通过UDP发送整个结构,但填充似乎是错误的。消息需要为64字节长,并且每个数据类型都有一个起始位和格式长度。这段代码可以编译和工作,但在接收端有一个不可读的纬度。Lat、long和alt每秒钟更新一次。有更多的数据字段,但我正在尝试从小处着手。格式的一个片段附有数据类型、单词位置、单词中的起始位,并附有以位为单位的长度,lat、long和alt位于消息中的其他位置。数据格式现在最好的想法是使用谷物(http://uscilab.github.io/cereal/index.html)但不确定这是否是一条死胡同。

struct TSPIstruct       //
{
double Latitude;
double Longitude;
double Altitude;
};
void SendDataUDP(double latitude, double longitude, double altitude)
{
TSPIstruct TSPI;
TSPI = CompileTSPI(latitude, longitude, altitude);

//printf("nr");
printf("Sending GPS over UDP at %d", LastSystemTime);
printf("nr");
printf("nr");

//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("nr");
printf("nr");
}
TSPIstruct CompileTSPI(double latitude, double longitude, double altitude)
{
TSPIstruct TSPI;
TSPI.Latitude = latitude;
TSPI.Longitude = longitude;
TSPI.Altitude = altitude;
return TSPI;
}

这可能是一个愚蠢的问题,但在发送二进制数据时,您不仅必须考虑填充/对齐,还必须考虑位排序。如果您确信µp artitecture在两侧都是相同的,您可以跳过后一点。在TCP中,他们添加了:

uint32_t htonl(uint32_t host32bitvalue) ;

等等。

如果你在同一台本地机器上尝试(即127.0.0.1),它能工作吗?

粘贴客户端和服务器代码。。我将在Unix和windows下尝试:)