学习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();