Problème fermeture socket

alexixlebaulois
Messages postés
6
Date d'inscription
mardi 20 janvier 2004
Statut
Membre
Dernière intervention
1 août 2005
- 20 juil. 2004 à 11:25
Kian_ix
Messages postés
26
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
5 avril 2009
- 15 mai 2008 à 04:09
Salut,

Je suis en train de créer une appli qui communique avec plusieurs serveurs pour récupérer leur état. Toutes les communications se font en même temps au moyen de threads. En gros, j'ai une vingtaine de threads qui communiquent toutes les 10 secondes avec des serveurs. Il y a autant de threads que de serveurs. Le code de chaque thread est le suivant :

DWORD WINAPI thread_tcp(LPVOID p)
{
char message[BUFFER_LENGTH];
SOCKET skt_client;
SOCKADDR_IN sin_client;
int timeout = 5000;

try
{
sin_client.sin_addr.s_addr = inet_addr(str_config_tcp->_str_config_tcp._ip.c_str());
sin_client.sin_family = AF_INET;
sin_client.sin_port = htons(str_config_tcp->_str_config_tcp._port);
skt_client = socket(AF_INET, SOCK_STREAM, 0);
if(skt_client == INVALID_SOCKET)
throw string("ERROR : fail to create socket");

if(connect(skt_client, (SOCKADDR *)&sin_client, sizeof(sin_client)) != SOCKET_ERROR)
{
setsockopt(skt_client, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
setsockopt(skt_client, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout));

message[0] = ...;
if(send(skt_client, message, 5, 0) == SOCKET_ERROR)
{
closesocket(skt_client);
throw string("ERROR : fail to send to server");
}
if(recv(skt_client, message, BUFFER_LENGTH, 0) != SOCKET_ERROR)
{...}
closesocket(skt_client);
}
}
catch(...){...}
return 0;
}

L'application est temps réel, elle tourne en permanence. Le problème c'est qu'au bout d'une journée, elle plante et lorsque je fais un "netstat", la liste des sockets est énorme, ce qui fait que Windows est saturé niveau connexions (même Internet ne marche plus...). J'ai donc un problème pour fermer mes sockets. Les serveurs sont écrits en Pascal (c'est pas moi qui les ai faits). J'ai essayé plusieurs trucs :
- mettre shutdown(skt_client, 2); avant le closesocket.
- mettre shutdown(skt_client, 2); sans le closesocket.
- utiliser l'option SO_LINGER (je ne suis pas sûr de l'avoir bien fait).

Je suis débutant en sockets alors j'avoue que je suis vraiment perdu dans cette histoire. Quelqu'un peut m'aider ?

2 réponses

cs_aardman
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
20 juil. 2004 à 13:01
Salut,
Affiche le numero de l'erreur avec WSAGetLastError() apres les appel a closesocket().
Ca permetra peut etre d'y voir plus clair.
0
Kian_ix
Messages postés
26
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
5 avril 2009

15 mai 2008 à 04:09
putin mec t trop flag mdr
0