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
Rejoignez-nous