如何在缓冲区中复制数据?

时间:2011-06-17 00:49:21

标签: c++ networking

我正在使用epoll进行网络编程,我有这段代码。

            int str_len = read(m_events[i].data.fd, buf, BUF_SIZE);
            printf("read %d \n", str_len);

            if(str_len == 0){
                if(!removeClient(m_events[i].data.fd))
                    break;
                close(m_events[i].data.fd);

            }
            else {
                printf("ServerManager::eventAcceptLoop, A message has been received \n");
                pushWork(buf);
            }

buf声明如下

buf[BUF_SIZE];

我希望将buf中的数据传递给函数“pushWork”

 pushWork(char * pdata){
      hand this pdata to the thread pool to parse and handle it
 }

我认为我需要复制buf中的数据而不是指向buf,因为每当有新数据进入时它都会被覆盖。现在我做的事情就像

 char *pdata = buf;
 pushWork(pdata)

我应该做memcopy还是别的什么?并冲洗buf? 请让我知道如何处理这个问题。提前谢谢......

1 个答案:

答案 0 :(得分:1)

是的,您可以复制数据:

char* pdata = new char[str_len];
memcpy(pdata, buf, str_len);
pushWork(pdata);

pushWork结束时,它必须在完成后处理数据:

delete[] pdata;

您还需要考虑将此全部封装到std::vector中,这样您就不必担心异常安全了:

std::vector<char> data(buf, buf + str_len);
pushWork(data);

在这种情况下,需要修改pushWork以按值std::vector 获取,但好处是它不必担心完成后删除数据,并且将是完全异常安全的。