学习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();
本文介绍了一种解决C++ Socket通信中粘包问题的方法。通过使用接收缓冲区和std::vector动态调整大小,确保数据包完整接收,并利用特定的数据包结束标记来正确解析接收到的数据。
1454

被折叠的 条评论
为什么被折叠?



