我做了自己的Socket类,能够发送和接收HTTP请求。 但我仍然有一些问题。下面的代码(我的接收函数)仍然是错误的,有时会崩溃。 我试过调试它,但它必须在指针算术/内存管理的某个地方。C C++ - TCP Socket类:接收问题
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)全包(?
我不能使用字符串,但它必须用字符来完成。
感谢您的帮助。
的memcpy(vpszRecvd,TempBuf,结果); 我现在编辑它。 – maxedmelon 2010-02-25 12:29:14
这有一个'C++'标签。所以,通过使用'std :: vector'来缓解所有的内存麻烦。如果你需要传递'char *'给C函数,使用'resize()'成员函数来设置它的大小并使用'&v [0]'(或'&v.begin()'):'recv(this- Socket,&v [0],v.size(),0)' –
sbi
2010-02-25 12:30:14
就像我说的,我不能用矢量的东西来做。它必须用字符来完成。 向量/字符串在这里会很棒:-( – maxedmelon 2010-02-25 12:35:54