传递数据结构
Passing data structures
本文关键字:数据结构 更新时间:2023-10-16
我的问题的背景信息:
- 我有一个基本的tcp/ip c 语言的服务器客户,
-
我创建了许多类似的结构(对于不同的软件包);
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];
-
我试图将数据传递到服务器端的结构;
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();}
-
这样的流行功能;
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
相关文章:
- 链表,反向函数,数据结构
- 如何使用set实现无序数据结构?
- 我们可以将数据永久保存为数据结构吗?
- C++中的可变长度数组/数据结构
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 通过 NIF 从C++返回自定义数据结构
- 编译器上的策略数据结构不起作用
- 尝试构建"lock-free"数据结构C++
- 设计将引用元素移动到开头的数据结构.C++
- 在学习数据结构之前对STL有一个了解是好的吗?
- 如何解析表示树状数据结构的字符串
- 我对数据结构、双向链表有一些问题
- googletest:测试太大的数据结构
- C++中deque数据结构的大O是什么?
- 我可以使用哪种数据结构来处理这种方式
- 将文本文件解析为树状数据结构
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 带参数的数据结构的全局声明