c++ - 如何复制缓冲区中的数据?

标签 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? 请让我知道我该如何处理。提前致谢...

最佳答案

是的,你可以复制数据:

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

关于c++ - 如何复制缓冲区中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6380274/

相关文章:

C++ 按列对二维 vector 进行排序

c# - 如何在 C# 中激活网络发现?

bash - Ubuntu 命令返回显示在 whois.domaintools.com 上的信息

java - 在网络中查找在特定端口上运行的服务器

c++ - 如果无法为空堆栈返回 nullptr,如何保护用户?

c++ - 如何更改 ListView 控件的 WndProc

C++ 多线程错误

c++ - 如何正确地覆盖从注入(inject)的 DLL 加载到内存中的指令?

networking - 通过 SSH 隧道访问 LDAP

linux - 将 4 个 NIC 合并为一个/技术名称