Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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++ 通过TCP/IP连接进行流式传输_C++ - Fatal编程技术网

C++ 通过TCP/IP连接进行流式传输

C++ 通过TCP/IP连接进行流式传输,c++,C++,我发现自己经常遇到这样的情况:我需要通过TCP/IP连接发送一组消息。我从来没有找到设计消息类的好方法。我希望有一个消息基类,其中所有消息都来自它。由于每条消息都有不同的字段,这将允许我通过成员变量或方法访问字段。类似于 class message_base { public: message_base(); virtual ~message_base(); unsigned int type; }; class message_control : public mes

我发现自己经常遇到这样的情况:我需要通过TCP/IP连接发送一组消息。我从来没有找到设计消息类的好方法。我希望有一个消息基类,其中所有消息都来自它。由于每条消息都有不同的字段,这将允许我通过成员变量或方法访问字段。类似于

class message_base
{
  public:
   message_base();
   virtual ~message_base();

   unsigned int type;
};

class message_control : public message_base
{
  public:
   message_control();
   virtual ~message_control();

   unsigned int action;
};
通过这种方式,我可以创建一个message_控件并访问操作成员,以便分配给和读取。我还可以在不编写太多代码的情况下传递消息

当我需要发送消息时,问题就出现了。如果我覆盖操作符>,那么我可以一次通过一个变量发送消息。该解决方案的问题是,由于发送数据的调用太多,上下文开关将猛击处理器。此外,流式处理操作符在socket类中结束,而不是在message类中结束

socket& socket::operator<<(message_control& message)
{
   sock << type;
   sock << action;
}
socket&socket::operator“该解决方案的问题是,由于要发送数据的调用太多,上下文切换将使处理器崩溃。此外,流式处理操作符将socket类终止,而不是我希望它存在的message类。”


第二个问题的解决方案是定义
操作符。你看过使用ACE吗?可能没有什么帮助,所以这只是一个注释。但我实现的模式几乎与上一个模式完全相同。除了在我的例子中缓冲区更合理一点之外,我有一些大的结构要在每条消息旁边传递,因此缓冲区变得非常有用,在我看来是合适的。尽管如此,它对我来说还是很好,即使我没有传递大数据,它也会同样好用!DeusAduro——我还需要将它用于大型(100 KB)消息。一旦我让我的缓冲区类在高线程环境中正常工作,事情就变得容易多了。我发现这是最好的解决方案,我很高兴我不是唯一的一个。我的答案是无核的,因为它与你澄清后的问题无关。在这方面,如果相同的逻辑已经适用于您,并且内存使用模式不是太“急促”(因为缓冲区太大),onebyone的建议看起来更合理。
socket& socket::operator<<(message_control& message)
{
   byte* buffer = new byte[sizeof(message.type) + sizeof(message.action)];

   memcpy(buffer, message.type, sizeof(message.type));
   memcpy(buffer + sizeof(message.type), message.action, sizeof(message.action));

   sock.send(buffer);
}
class socket
{
  public:
   socket();
   ~socket();

   socket& operator<<(buffer& buff);
};

class buffer
{
  public:
   buffer() {m_buffer = new byte[initial_size];}
   ~buffer() {delete [] m_buffer;}

   buffer& operator<<(unsigned int value);

  private:
   byte* m_buffer;
};

void message_control::serialize(buffer& buff)
{
   buff << type;
   buff << action;
}
sock << type;
sock << action;
stringstream ss;
ss << type;
ss << action;
sock << ss.str();