如何将缓冲区中的数据复制到内存中的某个位置(char *)

时间:2011-06-16 10:08:38

标签: c++ networking

int str_len = read(m_events[i].data.fd, buf, BUF_SIZE);

我有这个并且我将数据读入声明为

的buf中
char buf[BUF_SIZE];

我想要做的是,我正在尝试获取数据并将其交给我定义的WorkHanndler,而不仅仅是一个线程池。

功能是

void ServerManager::addWork(int sender, char *data){
    Work* work = new Work(sender, data);
    m_workHandler->addWork(work);
}

所以我需要一个指向我刚读过的数据的char指针。由于缓冲区被定义为数组,因此我无法将其传递给函数。

另外,你们认为这在服务器设计方面是个好主意吗?我正在从缓冲区读取数据并且不解析它,只是将原始数据传递给线程池(插入队列)。线程池有一个队列和五个独立的线程竞争,以使用互斥锁和条件变量从队列中获取作业。完成作业后,单独的线程会将结果写入输出缓冲区。如果它有缺点,请告诉我,你们有更好的主意。提前谢谢。

3 个答案:

答案 0 :(得分:0)

我认为“不兼容的类型”应该只是一个警告。 如果是错误,那么当您将缓冲区提供给函数时,请尝试将缓冲区转换为char *。 但这是一个快速而肮脏的解决方案 也许您应该考虑一个不会产生此错误的更通用的解决方案。

解析数据应该是工作者的工作。 如果你让主人解析它会让他慢下来。

答案 1 :(得分:0)

我现在看到的唯一可能缺陷可能在Work类内:确保它在构造函数中立即创建自己的缓冲区内容副本,因为一旦新数据到达,它将被覆盖。除此之外,它应该按预期工作(如果没有特定的工作要做,很难判断等)。

当需要指向数组元素类型的指针时,使用数组也不应该有问题,因为数组本质上只是一个指针(代码方式):

char data[1024];
char *pdata = data; // now data as well as pdata point to the first element
// data[0] is the same as using *(pdata + 0)
// data[1] is the same as using *(pdata + 1)

如果有一些编译器警告或错误,请发布确切的消息。访问数组的两个变体之间唯一真正的区别是,在使用char variable[]而不是char *variable时,编译器将知道他将使用整个数组而不是单个实例。

答案 2 :(得分:0)

你能避免复制吗?如果将数据读入缓冲区类,则可以对缓冲区实例进行排队,并立即为下一批数据创建另一个实例。没有复制,池线程将始终处理与从套接字读取的服务器线程不同的数据。当然,在池线程处理完数据之后,你必须释放缓冲区对象(或者复制它们),但这是为了避免复制,读/写冲突,跨线程同步的缓冲区指针操作而付出的代价。所有令人讨厌的东西都很难做到。

RGDS, 马丁