Meilleur auteur de réponses
Socket: Mon client se ferme après connexion au serveur

Question
-
Salut!!!
J'ai commencé depuis un certain temps à m'interesser à la communication reseau entre applications.
Pour cela j'utilise la classe Socket de .Net....
Mais je comprends pas pourquoi mon client se ferme juste après sa connexion au serveur?
J'ai le message suivant coté serveur : "Une connexion existante a dû fermée par l'hôte distant"
AU SECOURS!!!
Code connexion coté client:
public void ConnectToServer(string ServerName)
{
if (this.SocketClient == null || !this.SocketClient.Connected)
{
this.SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress[] ipadress;
//On récupere les informations du serveur (son nom puis son adresse IP)
IPHostEntry he = Dns.GetHostByName(ServerName);
ipadress = he.AddressList;
this.SocketClient.BeginConnect(new IPEndPoint(ipadress[0], 1001), new AsyncCallback(ConnectCallback), null);
}
else
{
//on affiche un message
MessageBox.Show("Déjà connecté à un serveur");
}
}
/// Fonction de rappel pour la connection
/// <param name="asyncResult">un objet IAsyncResult</param>
private void ConnectCallback(IAsyncResult asyncResult)
{
try
{
//on récupere le socket sur lequel la connexion doit avoir lieu
Socket socket = (Socket)asyncResult.AsyncState;
//On affect SocketClient au socket de connection
this.SocketClient = socket;
//on met fin à la demande de connection
socket.EndConnect(asyncResult);
//on affiche un message
DisplayMessage("Connecté à un serveur");
this.LocalsocketClientIsShutingDown = false;
// On initie une lecture
this.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
catch (SocketException ex)
{
DisplayMessage(ex.Message);
}
}
Réponses
-
Bonjour,
Avez-vous essayé d’implémenter l’exemple de la page MSDN
Comment : utiliser les sockets pour mieux comprendre le mécanisme ?
Cordialement,
Alex
________________
Astuces pour Visual Studio 2010
XNA – Développement jeux vidéo
Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF
Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.
- Marqué comme réponse NMBodrick vendredi 29 avril 2011 23:37
-
Bonjour,
Vérifier l'adresse IP sur lequel vous faites le Bind() et le Connect().
En utilisant GetHostByName() côté serveur avec GetHostName(), vous allez obtenir les adresses IP des cartes réseaux (192.XXXXXXX par exemple). En revanche côté client si vous faites un GetHostByName() avec "localhost" en paramètre, vous allez obtenir l'adresse IP de la boucle locale (127.0.0.1), ce qui ne fonctionnera pas... Spécifiez donc le nom NETBIOS de votre machine en paramètre à GetHostByName() côté client.Cordialement
Gilles TOURREAU - MVP C#
Architecte .NET/Consultant/Formateur chez Winwise
Blog : http://gilles.tourreau.fr
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5- Marqué comme réponse NMBodrick mardi 21 décembre 2010 14:23
Toutes les réponses
-
Bonjour,
Mais je comprends pas pourquoi mon client se ferme juste après sa connexion au serveur?
Tout simplement parceque votre serveur a fermé la connexion de son côté lors que vous faites un BeginReceive().Cordialement
Gilles TOURREAU - MVP C#
Architecte .NET/Consultant/Formateur chez Winwise
Blog : http://gilles.tourreau.fr
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5 -
Bonjour,
Mais pourquoi alors le serveur fermerait la connexion alors que le client venait à peine de se connecter????
Pouvez-vous nous donner le code côté serveur ?Cordialement
Gilles TOURREAU - MVP C#
Architecte .NET/Consultant/Formateur chez Winwise
Blog : http://gilles.tourreau.fr
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5 -
Mais pourquoi alors le serveur fermerait la connexion alors que le client venait à peine de se connecter????
C'est le BeginReceive qui pose problème? Le quel? Ou alors avez vous une bonne marche à suivre pour l'utilisation d'une Socket?
CODE DU SERVEUR ( c'est celui que j'avais mis là dessus...)
public void RunServer()
{
// Création socket serveur.
this.SocketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress[] ipadress;
//On récupere les informations de l'ordinateur (son nom puis son adresse IP)
IPHostEntry he = Dns.GetHostByName(Dns.GetHostName());
ipadress = he.AddressList;
//On lance l'écoute sur le port voulu
this.SocketServer.Bind(new IPEndPoint(ipadress[0], 1001));
//On spécifie le nombre de connexion en attente maximun ici 1
this.SocketServer.Listen(100);
//On se met en attente de la connection d'un client
this.SocketServer.BeginAccept(new AsyncCallback(ConnectionAcceptCallback), this.SocketServer);
}
private void ConnectionAcceptCallback(IAsyncResult asyncResult)
{
try
{
//On récupere le socket qui possede la connection
Socket socket = (Socket)asyncResult.AsyncState;
// Si le handle est à -1 --> La socket Serveur a été fermée.
if (socket.Handle.ToInt32() != -1)
{
//on accepte la connection
this.SocketClient = socket.EndAccept(asyncResult);
this.LocalsocketClientIsShutingDown = false;
MessageBox.Show("Un client s'est connecté");
//On se met en attente d'un message
this.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), this.SocketClient);
}
}
catch (SocketException ex)
{
MessageBox.Show(ex.Message);
}
}
-
Bonjour,
Avez-vous essayé d’implémenter l’exemple de la page MSDN
Comment : utiliser les sockets pour mieux comprendre le mécanisme ?
Cordialement,
Alex
________________
Astuces pour Visual Studio 2010
XNA – Développement jeux vidéo
Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF
Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.
- Marqué comme réponse NMBodrick vendredi 29 avril 2011 23:37
-
Bonjour,
Vérifier l'adresse IP sur lequel vous faites le Bind() et le Connect().
En utilisant GetHostByName() côté serveur avec GetHostName(), vous allez obtenir les adresses IP des cartes réseaux (192.XXXXXXX par exemple). En revanche côté client si vous faites un GetHostByName() avec "localhost" en paramètre, vous allez obtenir l'adresse IP de la boucle locale (127.0.0.1), ce qui ne fonctionnera pas... Spécifiez donc le nom NETBIOS de votre machine en paramètre à GetHostByName() côté client.Cordialement
Gilles TOURREAU - MVP C#
Architecte .NET/Consultant/Formateur chez Winwise
Blog : http://gilles.tourreau.fr
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5- Marqué comme réponse NMBodrick mardi 21 décembre 2010 14:23
-
Bonjour,
Federer243, est-ce que ces derniers conseils vous ont aidé à progresser ? je vous remercie de nous tenir au courant avec l’état de votre projet.
Cordialement,
Alex
________________
Astuces pour Visual Studio 2010
XNA – Développement jeux vidéo
Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF
Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.
-
Merci pour le lien!!!
Dans l'ensemble, je maitrise petit à petit la technologie de Socket... J'aimerai plutard communiquer parfaitement avec les clients connectés, envoyer une commande à tel ou tel autre client, recuperer son son adresse IP par exemple,...
Merci pour ton aide. :-)
-
Bonjour!!!
J'utilise une variale pour le nom du serveur
IPHostEntry he = Dns.GetHostByName(ServerName);
// ServerName recupère le contenu du textBox...
J'arrive quand même à me connecter au serveur et j'aimerai aller plus loin dans cette techn ologie....
Merci
-
Bonjour,
Pouvez-vous nous dire si ma réponse répond à votre problème ? Si vous avez de nouveau un autre problème, merci de créer une nouvelle discussion.
Cordialement
Gilles TOURREAU - MVP C#
Architecte .NET/Consultant/Formateur chez Winwise
Blog : http://gilles.tourreau.fr
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5