传递数据结构

Passing data structures

本文关键字:数据结构      更新时间:2023-10-16

我的问题的背景信息:

  1. 我有一个基本的tcp/ip c 语言的服务器客户,
  2. 我创建了许多类似的结构(对于不同的软件包);

     struct PACKED AddOrderMessageNoMPIDPackage 
        int8_t  code                   //code of package 'A'
        int32_t nanosecond_elapsed;     
        int64_t order_id;                
        int32_t order_book_id;            
        char    side;                     
        int32_t order_book_position;      
        char session[10];
    
  3. 我试图将数据传递到服务器端的结构;

        A.to_little_endian(); //(Firstly i use `nhton,hnton` fucntions)
        A.code = server.pop();  //Server is a class include pop functions etc
        A.nanosecond_elapsed = server.pop32();
        A.order_book_id = server.pop32();
        for (int i = 0; i < 32; i++) {
        A.symbol[i] = server.pop();}
    
  4. 这样的流行功能;

        int32_t TcpServer::pop32(){
        int32_t ch;
        if(::recv(_sockFd, &ch, 4, 0)>0)
        return getLeValue(ch);   // nhton hnton functions
    

我不能将数据传递到结构中,有人对此有任何想法吗?

您应该将结构写入字节数组,然后发送字节数组。您绝对不应以二进制方式编写结构,既不是文件,也不应将其写入插座。在另一侧,您读取字节数组,然后将值读回您的结构。

这是一些示例代码,我如何做。这种方法没有问题。这样做比写下套接字的每个值还可以为您提供更好的性能。我正在使用它来发送UDP数据报,但也可以用来通过TCP发送。

您需要一些功能,例如以下功能。

virtual MESSAGE_BUFFER * GetMessageAsBinaryPtr()
{
  MESSAGE_BUFFER * binaryMsg = new MESSAGE_BUFFER;
  UINT8 * ptrBuffer = &(*binaryMsg)[0];
  ptrBuffer = this->serializeUInt16(ptrBuffer, this->m_majorVersion);
  ptrBuffer = this->serializeUInt16(ptrBuffer, this->m_minorVersion);
  ptrBuffer = this->serializeUInt32(ptrBuffer, (UINT32)this->m_messageType);
  ptrBuffer = this->serializeUInt64(ptrBuffer, this->m_packetID);
  ptrBuffer = this->serializeDouble(ptrBuffer, this->m_timestamp);
  return binaryMsg;
}
virtual void CreateFromBinary(MESSAGE_BUFFER buffer)
{
  UINT8 * ptrBuffer = &buffer[0];
  ptrBuffer = this->deserializeUInt16FromBuffer(ptrBuffer, &this->m_majorVersion);
  ptrBuffer = this->deserializeUInt16FromBuffer(ptrBuffer, &this->m_minorVersion);
  UINT32 messageType = 0;
  ptrBuffer = this->deserializeUInt32FromBuffer(ptrBuffer, &messageType);
  this->SetMessageType((MessageTypes)messageType);
  ptrBuffer = this->deserializeUInt64FromBuffer(ptrBuffer, &this->m_packetID);
  ptrBuffer = this->deserializeDoubleFromBuffer(ptrBuffer, &this->m_timestamp);
}
inline UINT8 * serializeUInt16(UINT8 * buffer, UINT16 value)
{
  buffer[1] = value;
  buffer[0] = value >> 8;
  return buffer + 2;
}
inline UINT8 * deserializeUInt16FromBuffer(UINT8 * buffer, UINT16 * pOutput)
{
  *pOutput = (*pOutput << 8) + buffer[0];
  *pOutput = (*pOutput << 8) + buffer[1];
  return buffer + 2;
}

编辑:我找到了一段时间前指导我走上正确的道路的帖子。这里有更多解释:通过C

中的插座传递结构