2011-06-17 52 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