warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 septembre 2009
-
18 août 2005 à 14:37
warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 septembre 2009
-
19 août 2005 à 22:21
Bonjour
j'ai un probleme avec une application...
je veux faire un petit serveur qui fonctionnerai en TCP
il marche mais mal: je ne peux pas le fermer... et je n'ai plus de controle sur la form une fois lancée
this.tbhide.Location =
new System.Drawing.Point(0, 0);
this.tbhide.Name = "tbhide";
this.tbhide.Size =
new System.Drawing.Size(112, 13);
this.tbhide.TabIndex = 0;
this.tbhide.Text = "";
//
// Form1
//
this.AutoScaleBaseSize =
new System.Drawing.Size(5, 13);
this.ClientSize =
new System.Drawing.Size(115, 14);
this.ControlBox =
false;
this.Controls.Add(
this.tbhide);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(
false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static
void Main()
{
Application.Run(
new Form1());
}
private
void connex()
{
try
{
Socket s =
new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
listener =
new TcpListener(80);
while (
true)
{
listener.Start();
s = listener.AcceptSocket();
if (s.Connected)
{
reception(s);
}
}
}
catch(SocketException e)
{
MessageBox.Show(e.ToString());
}
}
<HR>
je ne met pas la suite car elle ne pose pas de problemes
lorsque je lance le serveur, la fenetre ne s'affiche pas. elle ne s'affiche QUE si je met this.show() DANS la fonction connex() et AVANT le try{}
si je met ça dans le form1() ça s'affiche pas , de meme si je met autre part dans le code.
par exemple aussi, si je met tbhide.text = "coucou" avant le try dans connex() le textbox correspondant se met a jour. sinon ça ne marche pas
dans le meme genre si je met un application.exit() ça ne quitte pas l'application. quelque soit l'endroit ou je le met
j'ai alors pensé à faire un thread pour connex()
mais sans succes
des idées?
la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 19 août 2005 à 19:02
Mieux vaut ne pas créer de forme principale si c'est juste pour la masquer.
Tu peux supprimer le socket "s" il n'a aucune utilité, du moins dans le code tel qu'il est plus haut, la classe Socket permet d'utiliser differents protocoles alors que TcpListener/TcpClient simplifie l'utilisation du protocole TCP/IP.
protected override void OnLoad( EventArgs e )
{
// base.OnLoad( e );
// Ici si tu as créé ta forme avec Application.Run( new MyForm( ) )
// il y'a une boucle de message, tu peux utiliser Form.Close ou Application.Exit
Connex( ); // Ca va encore se bloquer.
}
Connex va encore être bloquante à cause des méthodes AcceptSocket ou AcceptTcpClient. Je pense qu'il faudrait pogrammer ca de manière asynchrone et si tu restes dans une boucle il faudra un Application.DoEvents pour traiter les messages en attentes.
warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 septembre 2009 18 août 2005 à 16:21
oui j'y ai pensé
mais tu vois le truc c'est que quand j'enleve ce while mon serveur ne marche plus car il n'attend pas en continu une connexion
d'ou le thread. mais meme avec le thread ça ne marche pas
alors si j'enleve le while comment faire pour que le serveur attende indefiniment une connexion?
la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 septembre 2009 18 août 2005 à 20:07
bon je peux essayer
mais une question me turlupine... est ce que si je laisse le while et que je fais un thread et que j'utilise thread.sleep je pourai quitter l'application?
car si le while est infini , pourquoi l'application quitterai avec un thread.sleep ?
si ce n'est pas le cas comment pourrais je "termnier" le thread
j'ai essayé avec application.threadclose (ou un truc dans le genre) mais ça n'a pas marché
la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 septembre 2009 19 août 2005 à 01:47
je vais essayer. :)
bon pour tester j'ai donc mis un application.exit() en plein dans ma boucle... sans effets!
l'application ne se ferme pas, rien ne se passe...
bref donc ça doit venir d'autre chose. ce qui me semblait bien vu que j'avais essayé de faire sans la boucle while et que ça n'avait pas eu d'effets...
la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 septembre 2009 19 août 2005 à 01:49
pour confirmer ce que je viens de dire, j'ai fait un changement a ma boucle while de maniere à ce que la condition "false" arrive a un moment... meme en faisant ça pas moyen de quitter l'application; je n'ai toujours pas le controle sur la form
donc le fait que l'app freeze ne vient pas de la boucle.
une autre idée? ;)
la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 19 août 2005 à 05:37
Salut,
Première chose que je ne comprends pas, tu crées un socket "s" qui est écrasé 3 lignes aprés, ca sert à rien et tu perds des ressources.
A la place de AcceptSocket utilise plutôt AcceptTcpClient, c'est plus simple.
Le problème c'est pas vraiment la boucle c'est surtout que AcceptSocket et AcceptTcpClient sont des methodes bloquantes.
Ta forme ne s'affiche pas parce que tu ne sors jamais du constructeur, ( Connex est appelée dans le constucteur ), la méthode Application.Run n'est donc jamais executée et tu n'as pas de boucle de messages, ta forme ne peut pas répondre, tu peux juste l'afficher avec "Show" ou "Visible = true" dans le constructeur, et Application.Exit ou Close ne marche pas pour la même raison.
warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 septembre 2009 19 août 2005 à 12:19
ok mais dans ce cas quand dois je appeler connex()?
a l'origine ce serveur va afficher des boites de dialogues ou des fenetres quand un utilisateur rentre un texte sur un ordinateur client. celui ci rentre son texte, choisi quelle type de fenetre va apparaitre sur l'ordinateur cible, et le serveur lance la fenetre choisie avec le texte approprié.
donc je n'ai pas besoin que la forme principale soit visible. au contraire. par contre les autres formes le seront. le truc qui me genais etait que ça marchait mais que le fait que je ne puise specifier a la forme d'etre cachée (et qu'elle le fasse quand meme) me faisait penser que le code etait cochon
je vais donc essayer AcceptTcpClient. reste a savoir ou et comment lancer ma fonction connex()
jusqu'a maintenant je lançais toujours mes fonctions depuis le constructeur...