【问题标题】:Initializing a public char buffer dynamically动态初始化公共字符缓冲区
【发布时间】:2009-12-10 21:35:54
【问题描述】:

我是 C++ 的菜鸟。我有一个关于动态初始化字符缓冲区的问题

class Pkg {
  public:
    Header t;
    char buf[LENGTH];
};

我将通过网络发送类的对象。 Header类转换为网络字节序

所以,我想这样发送

Pkg ackpkt;

sendto(sd, &ackpkt, sizeof(ackpkt), 0,(struct sockaddr*)socket1,sizeof(struct sockaddr_in);

此处的 LENGTH 字段应在每次调用 sendto 之前动态分配。 我认为这样做的一种方法是将 LENGTH 声明为全球性的。

在接收方,我想在同一个类的对象中接收对象。即对象t的数据应该组织在ackpktrecv.t中,缓冲区在ackpktrecv.buf中

recvfrom(sd, &ackpktrecv, sizeof ackpktrecv, 0, (struct sockaddr*)&sockaddrs, &len);

如何接收字符缓冲区长度与 LENGTH 相同的对象 任何人都可以建议我以什么方式实现这一目标?

【问题讨论】:

    标签: c++


    【解决方案1】:

    由于这是 C++,请考虑使用 vector<T> 而不是 char。

    class Pkg {
    public:
      Pkg(vector<char>::size_type size) :buf(size) {
      }
    
      vector<char> buf;
    };
    

    这允许您通过以下方式发送数据

    Pkg ackpkt(someSize);
    sendto(
      sd,  
      &(ackpkt.buf[0]), 
      actpkt.buf.size(), 
      0,
      (struct sockaddr*)socket1,
      sizeof(struct sockaddr_in)
    

    【讨论】:

    • 哦,但我想在服务器端接收对象。那么这个工作,recvfrom(sd, &ackpkt, sizeof ackpkt, 0, (struct sockaddr*)&sockaddrs, &len);我希望我在字符缓冲区中发送的数据重新组织到同一类的接收方对象的字符缓冲区中。
    • @CG 接收工作正常,但您可能需要分块进行,然后将数据包重新组合在一起。这对于向量来说真的很容易,因为它们很容易连接。
    【解决方案2】:

    我推荐一个 RAII 成语:

    • 使Pkg的构造函数接受length参数,并在构造函数中分配bufnew char[length]
    • 使 Pkg 的析构函数执行delete[] buf

    然后每次循环,您只需创建一个具有所需长度的新 Pkg 对象。

    【讨论】:

    • 那么,如何在接收方的 Pkg 对象中以相同长度(与发送时)重新组织字符缓冲区?:
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    相关资源
    最近更新 更多