J'ai fait ma propre classe Socket, pour pouvoir envoyer et recevoir des requêtes HTTP. Mais j'ai encore quelques problèmes. Le code suivant (ma fonction de réception) est toujours buggé, et s'écrase parfois. J'ai essayé de le déboguer, mais cela doit être quelque part dans la gestion de l'arithmétique du pointeur/de la mémoire.C C++ - Classe TCP Socket: Problème de réception
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;
}
Quelqu'un voit tout ce qui pourrait causer l'accident, ou que quelqu'un a un exemple mieux/plus rapide/plus petit et stable comment recevoir un paquet complet via recv()?
Je ne peux pas utiliser de chaînes, mais cela doit être fait avec des caractères.
Merci pour votre aide.
memcpy (vpszRecvd, TempBuf, Résultat); Je vais le modifier maintenant. – maxedmelon
Ceci a une balise 'C++'. Alors débarrassez-vous de tous les tracas de la mémoire en utilisant 'std :: vector' pour les tampons. Utilisez sa fonction membre 'resize()' pour définir sa taille et utilisez '& v [0]' (ou '& v.begin()') si vous devez passer un 'char *' aux fonctions C: 'recv (this- Socket, & v [0], v.size(), 0) ' –
sbi
comme je l'ai dit, je ne peux pas le faire avec des trucs de vecteur. Cela doit être fait avec des caractères. Vecteurs/cordes serait bien ici :-( – maxedmelon