【问题标题】:Insert into a vector from a function从函数插入向量
【发布时间】:2013-10-21 13:35:26
【问题描述】:

我正在为路由器编写代码。我已经设法从客户那里发送和接收信息。我现在要做的是创建一个向量来处理来自我拥有的接收包的线程的所有传入包。

我正在使用 C++ 和 BOOST。

int rawpacket_recv(int s, unsigned char *packet, int length)
{
    int to_recv = 0;

    to_recv = read(s, packet, length);
    //and some error detection
}

void RecvThread(int *socket)
{
    int eth_receiver, eth_socket;

    eth_socket = *socket;

    for(;;)
    {
        unsigned char *eth_buffer = (unsigned char *)malloc(1518);

        eth_receiver = rawpacket_recv(eth_socket, eth_buffer, 1518);

        //put eth_buffer into a vector defined in main

        free(eth_buffer);
        usleep(10000);
    }
}

int main(int argc, char **argv)
{
    vector<unsigned char *> packages;

    int eth0socket;
    char eth0 = "eth0";

    eth0socket = CreateAndBindSocket(ETH_P_ALL, &eth0socket, eth0); //Method from the program that does what it name describes

    boost::thread eth0recvthread(RecvThread, &eth0socket);

    eth0recvthread.interrupt();
    eth0recvthread.join();

    return 0;
}

我在 sn-p 中留下了一些不重要的代码,但我想要的是 RecvThread 能够将接收到的包放入这个向量中,以便我可以在 main 方法中处理它们(现在)——大概作为互斥体/信号量工作。

谢谢!

【问题讨论】:

  • 看起来像内存泄漏等待发生,加上竞争条件。
  • 您应该尝试使用libtins。处理原始数据包可能会很痛苦。
  • 也许一些提供并发数据结构的库也会有所帮助。
  • 也许队列比向量更能处理传入的数据包?
  • @Jepessen 你可能是对的。不知道 C++ 有一个队列容器,因为我主要习惯于 C# 和 Java。我将给队列容器看看

标签: c++ function sockets vector insert


【解决方案1】:

(注意:对于未来的问题,您使用的 IDE 确实与手头的问题无关,除非问题是 关于 IDE 本身.. :) )

话虽如此,顺序应该是:

  1. 将对向量的引用传递给您的线程函数(和互斥体 + 条件变量)。
  2. 在线程函数中,获取互斥体,推送到向量并通知条件变量。
  3. 在主函数中,在循环中,等待条件变量的通知,如果向量不为空,则处理条目。
  4. 正确管理内存(即使用vector&lt;unsigned char&gt; 来存储数据包而不是原始缓冲区,那么您就不必费心释放...

【讨论】:

  • 老实说,我对 C++ 还很陌生。通过传递引用,您的意思是我应该将它包含在函数调用中?如果是这样,我该怎么做。我对指针和东西的想法很陌生。另外,我如何将“unsigned char *”类型的数据包放入“unsigned char”类型的向量中?
【解决方案2】:

将向量连同它的互斥体以及内存管理放在一个类中。 (不应该是malloc,除非有一个现有的 C API 消耗分配)

【讨论】:

  • 获得了下一个巨大的挑战。我讨厌在 C++ 中使用类。我基本上不知道如何处理 .h 和 .cpp 文件。您是否有勇气尝试解释它们的工作原理?
  • @Zeliax:有几十个(书)作者做到了这一点,比我用 600 个字符做的还要好。
  • 是的。不管怎么说,还是要谢谢你。我会在万维网上找到一些东西;)
  • 如何将向量“放入”类中?你想让我创建一个具有类似 Vector 行为的类吗?扩展向量类?或者只是创建一个通过函数处理向量的类?
  • @Zeliax:只需添加一个成员变量,类型为std::vector&lt; Packet &gt;。最大的问题实际上是选择 Packet 的类型。
猜你喜欢
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多