C++:在tcp/ip上发送字节时使用矢量的最佳方式

C++: Best way to use vector in send bytes over tcp/ip

本文关键字:方式 最佳 字节 tcp ip C++      更新时间:2023-10-16

我在通过tcp/ip传输大数据时遇到问题。要传输的字节的矢量大小总是在500000左右。我有两个解决方案来处理这个问题,但我不知道什么更好,或者有另一个解决方案。

对于2解决方案,我有2个类来存储数据。每个类有2种方法:

  1. push(std::vector<BYTE_T& data>);
  2. vector<BYTE_T >pop();

#define BYTE_T unsigned char

方法1:使用vector<BYTE_T>

    class buffDdata1 {
      vector<BYTE_T> listData;
      vector<BYTE_T> listDataTmp;
public:      
     buffDdata1 () {
        listData.reserver(500000);
        listDataTmp.reserver(500000);
     }
void push(vector<BYTE_T>& data) {
     lock();
     listData.insert(listData.end(), data.begin(), data.end());
     unlock();
}
vector<BYTE_T>& pop() {
          lock();
          listDataTmp.clear();
          listDataTmp.swap(listData);
          unlock();
          return listDataTmp;
}
};

方法2:使用vectorvector

class buffData2 {
      vector<vector <BYTE_T> > listData;
      int nCount;
public:
      buffData2() {
           listData.reserver(200000);
      }
      void push(vector <BYTE_T>& data) {
           lock();
           listData.push_back(data);nCount++;
           unlock();
      }
      vector <BYTE_T> pop() {
           vector <BYTE_T> listRet;
           lock();
           for(int i=0; i< nCount; ++i) {
                listRet.insert(listRet.end(), listData[i].begin(), listData[i].end());
           }
           unlock();
           return listRet;
      }
};

Way 1让推送线程在保持锁的同时附加数据(因此推送的字节数为O(N)),而Way 2有O(1)推送,但稍后会为弹出线程做更多的工作(并且始终保持锁)。

哪一个更好取决于你的工作性质,但它足够复杂,重要性也足够可疑,你应该简单地用你的实际工作量来描述这两者。

还有其他选择-例如,特别是如果你的平均推送大小合理(例如千字节或更多)-你可以使用第2种方式并返回向量的向量-让弹出的代码依次发送每个向量,而不需要花时间将它们合并到更大的应用程序缓冲区中。无论如何,您的TCP实现都会合并它们(如果您发送它们的速度足够快,例如Naggle算法不会变得不耐烦,并发送当时可用的内容)。

另外,您不需要nCount-vector暴露它们的size(),而listData.reserve(200000);似乎真的太多了——这可能并不重要。