簡體   English   中英

傳遞數據結構

[英]Passing data structures

我的問題的背景信息:

  1. 我有一個使用c ++語言的基本TCP / IP服務器客戶端,
  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中的套接字傳遞結構

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM