Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 继续通过UDP发送数据的最佳方式,数据格式为C+中给定的数据格式(双精度、浮点、整数、1位布尔)+/Visual Studio?序列化?_C++_Serialization_Udp_Cereal - Fatal编程技术网

C++ 继续通过UDP发送数据的最佳方式,数据格式为C+中给定的数据格式(双精度、浮点、整数、1位布尔)+/Visual Studio?序列化?

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字节长,并且每种

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

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,这在这些情况下很有用。如果您尝试发送一个完整的结构,它能工作吗?