2011-06-17 59 views
2

我正在使用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到functiion “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? 请让我知道我该如何处理这件事。在此先感谢...

+0

如果您要异步使用数据,是的,您需要将它复制到一个新的缓冲区。 – madmik3 2011-06-17 00:51:50

回答

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按值,但好处是,它不会担心完成后删除数据,并且将完全的异常安全性。

+0

感谢您的回答。我还需要在pushWork之后清除buf以准备新的数据包进入吗? – user800799 2011-06-17 01:00:35

+0

@ user800799:不需要,只需重新使用即可。 – 2011-06-17 01:11:00