我自己写了一个Socket类,以便能够发送和接收HTTP请求。但是我仍然遇到一些问题。下面的代码(我的接收函数)仍然有错误,并且有时会崩溃。我尝试进行调试,但这可能是指针算术/内存管理中的某个地方出了问题。
int Socket::Recv(char *&vpszRecvd)
{
//vpszRecvd = NULL;
int recvsize = 0;
char TempBuf[1024];
int Result = 0;
char* temp;
do
{
memset(TempBuf, 0, sizeof(TempBuf));
Result = recv( this->sSocket, TempBuf, sizeof(TempBuf) -1, 0 );
if (recvsize == 0)
recvsize = Result;
if ( Result > 0 )
{
if ( vpszRecvd != NULL )
{
if (temp == NULL)
{
temp = (char*)calloc(recvsize + 1, sizeof(char));
}
else
{
realloc(temp, recvsize + 1);
}
if (temp == NULL)
return 0;
memcpy(temp, vpszRecvd, recvsize);
realloc(vpszRecvd, recvsize + Result);
if (vpszRecvd == NULL)
return 0;
memset(vpszRecvd, 0, recvsize + Result);
memcpy(vpszRecvd, TempBuf, Result);
memcpy(vpszRecvd + recvsize, TempBuf, Result);
recvsize += Result;
}
else
{
realloc(vpszRecvd, Result);
if (vpszRecvd == NULL)
return 0;
memset(vpszRecvd, 0, Result);
memcpy(vpszRecvd, TempBuf, Result);
recvsize += Result;
}
}
else if ( Result == 0 )
{
return recvsize;
}
else //if ( Result == SOCKET_ERROR )
{
closesocket(this->sSocket);
this->sSocket = INVALID_SOCKET;
return SOCKET_ERROR;
}
}
while( Result > 0 );
return recvsize;
}
有人看到任何可能导致崩溃的问题吗?或者有没有更好/更快/更小且稳定的示例,可以通过recv()接收完整数据包?
我不能使用字符串,必须使用字符。
感谢您的帮助。
C++
。因此,通过使用std::vector<char>
缓冲区来摆脱所有内存问题。可以使用其resize()
成员函数设置其大小,并且如果需要将char*
传递给 C 函数,则使用&v[0]
(或&v.begin()
):recv(this-Socket,&v [0],v.size(),0)
。 - sbi