我做了自己的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