J'ai écrit un petit écouteur de test tcp. Ledit auditeur écoute le port 28328 et fonctionne de manière fantastique, attendez-vous à l'énorme fuite de ressources/mémoire qui se produit chaque fois qu'un client se connecte à lui.C++ Winsock Accepter Fuite de mémoire/Fuite de ressources
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
SOCKET Socket = INVALID_SOCKET;
bool TestServer()
{
WSADATA wsaData = { 0 };
if (WSAStartup(MAKEWORD(2, 2), &wsaData))
return false;
sockaddr_in addr = { 0 };
Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int Enable = 1;
setsockopt(Socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&Enable, sizeof(int));
addr.sin_family = AF_INET;
addr.sin_port = htons(28328);
addr.sin_addr.s_addr = INADDR_ANY;
if (bind(Socket, (sockaddr*)&addr, sizeof(sockaddr)))
return false;
if (listen(Socket, 50))
return false;
return true;
}
void Dolisten()
{
if (TestServer())
{
sockaddr_in addr = { 0 };
SOCKET Client_Socket = 0;
int Lenght = sizeof(addr);
for (;;)
{
Client_Socket = INVALID_SOCKET;
Client_Socket = accept(Socket, (struct sockaddr *)&addr, &Lenght);
if (Client_Socket == INVALID_SOCKET)
continue;
printf("Client Connected %X\n", Client_Socket);
shutdown(Client_Socket, 2);
closesocket(Client_Socket);
}
}
}
int main(int argc, char* argv[])
{
Dolisten();
WSACleanup();
return 0;
}
Alors que l'auditeur d'origine est beaucoup plus grand que cela et a probablement beaucoup plus de problèmes que je ne l'ai pas encore appris à, au moment ce mon plus gros problème.
Je suppose que le problème se produit à la suite de l'acceptation de la socket et il ne ferme pas correctement qui fuit alors à une fuite de poignée. Je me base sur le fait que lorsque j'ai regardé le gestionnaire de tâches et d'autres outils qui surveillent un processus, je peux voir le nombre de handles augmenter au même rythme que ma connexion.
Note:
1) Par le regard de celui-ci la fuite se produit sur la mémoire non paginée.
2) Ce même fragment de code, s'il est compilé et utilisé dans un environnement Linux, ne produira pas la même fuite de mémoire/ressource.
3) J'ai compilé et testé ce code sur plusieurs machines Windows et le même problème se produit.
4) (EDIT) J'ai vu quelques personnes avec ce problème sur des forums MSDN et des forums VS mais tout ce qu'on leur a dit de faire était de soumettre un ticket.
"Ce même extrait de code si compilé et utilisé dans un environnement Linux" Votre code est spécifique à WinAPI et ne sera pas compilé ou exécuté de manière native dans un environnement Linux. – tambre
@tambre Je sais, comme je l'ai dit sur le post c'est un écouteur de test à poster ici, ce n'est pas le code original et le code original peut être compilé sur windows et linux. N'oubliez pas, même si ce n'est pas le code original, le problème est toujours présent. Désolé de ne pas être plus précis. –
@Asesh Oui, j'ai manqué cela ici mais je peux vous assurer que le code original le contient sur onexit –