0

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

我正在使用 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;
}

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

谢谢!

4

2 回答 2

1

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

于 2013-10-21T13:42:19.410 回答
1

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

话虽如此,顺序应该是:

  1. 将对向量的引用传递给您的线程函数(和互斥体 + 条件变量。)
  2. 在线程函数中,获取互斥体,推送到向量并通知条件变量。
  3. 在 main 函数中,在一个循环中,等待关于条件变量的通知,如果向量不为空,则处理该条目。
  4. 正确管理内存(即使用 avector<unsigned char>来存储数据包而不是原始缓冲区,那么您无需费心释放...
于 2013-10-21T13:42:15.380 回答