c++11 粘包问题解决思路

        学习c++11有一段日子,最近开始着手c++Socket通信,在如何解决粘包问题上,花了一些时间,初步解决方案记录如下如下:

std::thread th([&](){
		int iResult;
		std::vector<char> InputBuff;
		const int recvbuflen = 2048;
		

		while (isClientLive) {
			char recvbuf[recvbuflen] = {'\0'};
			iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
			if (iResult <= 0){
				if (iResult == 0) {
					printf("Connection closing...\n");
				}
				else {
					printf("recv failed:%d\n", WSAGetLastError());
					closesocket(this->ClientSocket);
					break;
				}
				break;
			}
			else {
				int vectorSize = InputBuff.size();
				InputBuff.resize(iResult + vectorSize);
				memcpy(InputBuff.data() + vectorSize, recvbuf, iResult);
				std::cout << std::string(InputBuff.data()).c_str() << std::endl;

				std::string tmpStr(InputBuff.begin(), InputBuff.end());
				auto index = tmpStr.find(packetEndTag);
				if (index != std::string::npos) {
					std::string packetData;
					packetData = tmpStr.substr(0, index + packetEndTag.length());
					this->OnReceive((char*)packetData.c_str(), packetData.length());
					InputBuff.erase(InputBuff.begin(), InputBuff.begin() + packetData.length());
					InputBuff.shrink_to_fit();
				}
			}
		}
		isClientEnd = true;
		this->clientSemaphore.signal();
		// No longer need server socket
		closesocket(ClientSocket);
		WSACleanup();
	});
	th.detach();


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值