Problème réseau + Helppppppppppp

Signaler
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
-
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
-
Bonjour,


Ma question s'adresse au personne qui ont déja programmé une application réseau. Comment avez vous faire pour fermé le serveur ???

quand je fais
socket_server.Close() ;

ca deconne immanquablement


il me marque :


Une exception non gérée du type 'System.InvalidOperationException' s'est produite dans system.dll


Informations supplémentaires : AcceptCallback


et impossible de savoir pourquoi, j'ai tout essayé mais ca deconne toujours


Voila, si jamais qq avait une petite idée sur le sujet meme infimme ca m'aiderais beaucoup


par avance, merci

9 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Pourtant c'est la bonne façon de fermer un socket.



Essaie de voir avec les différents sources réseau qu'on peut trouver
sur ce site, pour t'inspirer et voir comment tu pourrais resoudre ton
probleme.

Mx
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
sur les sources il marque socketserver.Close() et ca marche nikel, je sais pas pourquoi
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
je pense que si ca te fait ca, c'est qu'a mon avis quelque part tu as un thread en Accept (bloquer et en attente) et l'exception est balancée lorsque tu tente de le closer alors qu'il est dans un etat ou il n'est pas pres a etre fermer.

tente un socket_server.Shutdown();

sinon au pire fait un Abort sur ton thread. si tu as utiliser BeginAccept et EndAccept (ce qui est plus logique vu la nature de l'erreur) alors je ne peux pas t'aider, je n'ai jamais utiliser, desoler
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
merci de ta réponse, j'ai utiliser beginaccept :

si le met la ca marche :

public : Socket socket_serveur ;



fonction pour demarrer le serveur
etc...
socket_serveur.Listen(100) ;
socket_serveur.Close() ;
etc....

si je le met la :
fonction bouton fermé click
socket_serveur.Close()

ca deconne
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
heu... desoler mais j'ai rien compris a ce que tu as ecrit, c'est moi ou bien ?

public : Socket socket_serveur; // c'est une notation C# valide ca ? 0_o (on est pas sur cppfrance ici )
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
c'est du c++.net pareil que le c# juste remplacer les flèches par des points



void run_serveur(
int port)


{


socket_serveur =
new Socket(AddressFamily::InterNetwork, SocketType::Stream, ProtocolType::Tcp );


IPAddress* ipadress
__gc[] ;



// On récupere les informations de l'ordinateur (son nom puis son adresse IP)


IPHostEntry * he = Dns::GetHostByName(Dns::GetHostName());


ipadress = he->AddressList;


IPEndPoint * server =
new IPEndPoint(ipadress[0],port);


socket_serveur->Bind(server) ;


socket_serveur->Listen(100) ;





socket_serveur->close() // ca marche mais c'est pas super interssant de le mettre ici

//On se met en attente de la connection d'un client


AsyncCallback* pasync =
new AsyncCallback(
this, &Form1::connectionAcceptCallback);


socket_serveur->BeginAccept(pasync, socket_serveur);


}

ici :


public :
void CloseServer()


{


if (socket_serveur != 0 && socket_serveur->Handle.ToInt32() != -1)


{



this->socket_serveur->Close() ; // ca marche point quand je le met ici


}


}
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Et tu as un client connecté quand ca plante ou non ?

Normalement le Shutdown() + le Close() devraient suffir.



La source de cette exemple devrait t'aider a y voir plus clair :

http://vincentlaine.developpez.com/tuto/dotnet/socketasynchrone/csharp/#LIII




Mx
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
justement non, j'ai pas de client connecté, ca deconne en faite une fois beginaccept lancé en faite, j'ai essayé
socket_serveur->Shutdown(SocketShutdown::Both);

c'est pareil
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
j'ai la réponse si ca interesse quelqun


// si le serveur est ouvert on execute sinon on a une exception qui se produit



if (socket->Handle.ToInt32() != -1)


{



// la méthode endAccept, accepte le client et nous retourne son socket




socket_client = socket->EndAccept(asyncResult);





// on annonce qu'un client c'est connecté


String * ip_client = ((
__try_cast(socket_client->LocalEndPoint)->Address)->ToString());


String * phrase = String::Concat(ip_client, " s'est connecté à ", c->ToString(temps.Now)) ;


info->Items->Add(phrase) ;



// buffer1 recoit la taille du fichier avant d'initialiser buffer2, tjs sur 10 bits




buffer1 =
new Byte
__gc[10] ;




socket_client->BeginReceive(buffer1, 0,buffer1->get_Length(), SocketFlags::None,
new AsyncCallback(
this,&Form1::ReceiveMessageCallback1), socket_client);




}


}