Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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++ C++;字节流_C++_Struct_Byte_Memcpy - Fatal编程技术网

C++ C++;字节流

C++ C++;字节流,c++,struct,byte,memcpy,C++,Struct,Byte,Memcpy,对于网络应用程序,我们传输动态数据的方式是将结构存储到(void*)中。这会带来一些问题,比如对std::string执行此操作时。字符串可以是动态长度,那么另一方如何知道字符串何时结束?我的一个想法是使用类似于Java的DataOutStream的东西,我可以将任何变量传递给它,然后将其放入(void*)。如果这不能做到,那就太酷了。我只是不太喜欢记忆结构。这件事似乎有些不对劲 谢谢, Robbie结构上的memcpy没有什么问题-就像lng一样,结构中充满了固定大小的缓冲区。在那里放一个动态

对于网络应用程序,我们传输动态数据的方式是将结构存储到(void*)中。这会带来一些问题,比如对std::string执行此操作时。字符串可以是动态长度,那么另一方如何知道字符串何时结束?我的一个想法是使用类似于Java的DataOutStream的东西,我可以将任何变量传递给它,然后将其放入(void*)。如果这不能做到,那就太酷了。我只是不太喜欢记忆结构。这件事似乎有些不对劲

谢谢,

Robbie

结构上的memcpy没有什么问题-就像lng一样,结构中充满了固定大小的缓冲区。在那里放一个动态变量,你必须以不同的方式序列化它

如果您有一个包含std::strings的结构,请创建一个stream操作符并使用它格式化缓冲区。然后,您可以将该缓冲区存储到数据传输中。如果您有boost,请使用它来完成所有这些(该链接还具有指向可选序列化lib的链接)


注意:传递可变大小缓冲区的通常方法是首先发送长度,然后发送许多字节的数据。有时,您会看到数据一直传输到接收到分隔符为止(该数据中的字段本身由另一个字符分隔,例如逗号)。

结构上的memcpy没有问题,因为结构中填充了固定大小的缓冲区。在那里放一个动态变量,你必须以不同的方式序列化它

如果您有一个包含std::strings的结构,请创建一个stream操作符并使用它格式化缓冲区。然后,您可以将该缓冲区存储到数据传输中。如果您有boost,请使用它来完成所有这些(该链接还具有指向可选序列化lib的链接)


注意:传递可变大小缓冲区的通常方法是首先发送长度,然后发送许多字节的数据。有时,您会看到数据传输到接收到分隔符为止(数据中的字段本身由另一个字符分隔,例如逗号)。

我看到这个问题的两个部分: -通过网络对数据进行序列化 -如何将结构传递到网络堆栈中

要通过网络序列化数据,需要一个协议。不一定很难;对于ASCII,即使是cr/lf作为数据包端也可以这样做。如果您使用框架(如MFC),它可能会为您提供序列化功能;在这种情况下,您需要担心如何以数据包的形式发送。对我来说,一个经常行之有效的打包方法是:

<length><data_type>[data....][checksum]
[数据…][校验和]
在这种情况下,校验和是可选的,并且零数据也是可能的,例如,如果信号以数据类型携带(即ACKLNOWEDGE的Ack)


如果你在使用结构的MeMCPY工作,你需要考虑MimcPy只是一个浅拷贝。一旦通过网络传输,指针就毫无价值;例如,您应该从该指针传输数据(即字符串示例的内容)

我看到了这个问题的两个部分: -通过网络对数据进行序列化 -如何将结构传递到网络堆栈中

要通过网络序列化数据,需要一个协议。不一定很难;对于ASCII,即使是cr/lf作为数据包端也可以这样做。如果您使用框架(如MFC),它可能会为您提供序列化功能;在这种情况下,您需要担心如何以数据包的形式发送。对我来说,一个经常行之有效的打包方法是:

<length><data_type>[data....][checksum]
[数据…][校验和]
在这种情况下,校验和是可选的,并且零数据也是可能的,例如,如果信号以数据类型携带(即ACKLNOWEDGE的Ack)


如果你在使用结构的MeMCPY工作,你需要考虑MimcPy只是一个浅拷贝。一旦通过网络传输,指针就毫无价值;例如,您应该从该指针传输数据(即字符串示例的内容)

要通过网络发送动态数据,您有以下选项

同一数据包中的第一个选项

void SendData()
{
   int size;
   char payload[256];

   Send(messageType)
   Send(size);
   Send(payload)
}
第二种选择:

void SendData()
{
   char payload[256];

   Send(messageType)
   Send(payload)
}
尽管在这两种情况下,您将面临更多的设计选择。在第一个示例中,您将发送消息类型、有效负载大小以及有效负载

第二个选项是,可以发送消息类型,然后发送分隔符为null terminator的字符串

尽管我认为这两种选择都不能完全解决你面临的问题。首先,您需要确定您是否正在构建一个游戏,您将使用什么类型的协议,UDP?TCP?您将面临的第二个问题是最大数据包大小。然后,最重要的是,你需要有一个适当的框架,这样你就可以计算出最佳的数据包大小,而这些数据包不会被分割并丢失到互联网上。在这之后,您就可以在客户端和服务器之间传输和接收多少数据进行带宽控制

例如,大多数游戏处理这种情况的方式是,每个数据包都用以下内容标识

MessageType
MessageSize
CRCCheckSum
MessageID
void buffer[payload]
在需要发送动态数据的情况下,您将发送一系列数据包,而不仅仅是一个数据包。例如,如果您要通过网络发送文件,最好的选择是使用TCP/IP,因为它是一种流协议,它保证完整的流安全地到达另一端。另一方面,UDP是一种基于数据包的协议,它不检查所有数据包是否按顺序到达或是否在另一端到达

总而言之

  • 对于动态数据,发送多个带有特殊标志的数据包 要说更多的数据是为了完成这条信息
  • <> LI>保持简单,如果您与C++工作不承担数据包或数据 将包含空终止符,并检查与 如果您决定使用空终止符,则为有效负载
    要通过网络发送动态数据,您有以下选项