Problème réseau + Helppppppppppp

cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 - 20 avril 2005 à 10:59
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 - 21 avril 2005 à 10:49
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

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 avril 2005 à 11:36
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
0
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
20 avril 2005 à 11:43
sur les sources il marque socketserver.Close() et ca marche nikel, je sais pas pourquoi
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
20 avril 2005 à 12:25
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
0
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
20 avril 2005 à 12:31
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
20 avril 2005 à 12:58
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 )
0
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
20 avril 2005 à 13:28
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


}


}
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 avril 2005 à 13:41
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
0
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
20 avril 2005 à 13:46
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
0
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
21 avril 2005 à 10:49
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);




}


}
0
Rejoignez-nous