IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

envoie de packet


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut envoie de packet
    Bonjour,

    je suis en train de developper une application serveur client. J'ai des messages de petites tailles mais nombreux a envoyer a mon client. Le probleme c'est que l'algorithme de Nagle transformes ces messages en un seul message les regroupant par groupe. C'est normalement tres interessant, mais dans cette application ca devient tres genant.

    Je ne sais pas comment faire une trame par message.
    Merci de votre aide.

  2. #2
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    En appelant Flush() après chaque message?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    merci de ta reponse aussi rapide.

    Je ne vois pas bien comment utiliser les Flush.
    J'utilise des socket sous le framwork 1.1 de visual.

    Mon code:

    byte[] data =System.Text.Encoding.ASCII.GetBytes(trame1);
    monSocket.Send(data, 0, data.Length,SocketFlags.None);

    data =System.Text.Encoding.ASCII.GetBytes(trame2);
    monSocket.Send(data, 0, data.Length,SocketFlags.None);

    Le probleme c'est que mes trames 1 et 2 arrivent a mon client en une seule trame.

    Petite precision: je suis un novice en reseau et en c#, ce qui n'aide en rien

  4. #4
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Autant pour moi, il n'y a pas de Flush sur les Sockets mais bien sur les NetworkStream (Flush() qui ne fait rien d'ailleurs).

    Essaie (sans garantie) de mettre le SendBufferSize de ton socket à la taille de ta trame avant de l'envoyer.

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Le probleme c'est que mon appli dialogue avec des robots, et qu'ils n'envoient pas de trames de tailles fixes, elles dependent du message. Ta solution n'est pas vraiment adapter a mon cas precis.
    Merci de t'etre penché sur mon probleme.

    Faute de mieux je vais quand meme essayer ta solution. Meme si changer la taille du buffer a chaque message ne me plaie pas vraiment.

    Sinon j'ai trouvé ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, 1);
    mais je ne vois pas comment ca marche, et la msdn n'est pas assez claire pour moi.

  6. #6
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Citation Envoyé par xankow Voir le message
    Le probleme c'est que mon appli dialogue avec des robots, et qu'ils n'envoient pas de trames de tailles fixes, elles dependent du message. Ta solution n'est pas vraiment adapter a mon cas precis.
    Merci de t'etre penché sur mon probleme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    byte[] data =System.Text.Encoding.ASCII.GetBytes(trame1);
    monSocket.SendBufferSize(data.Length);
    monSocket.Send(data, 0, data.Length,SocketFlags.None);
    
    data =System.Text.Encoding.ASCII.GetBytes(trame2);
    monSocket.SendBufferSize(data.Length);
    monSocket.Send(data, 0, data.Length,SocketFlags.None);

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    msdn:
    "La propriété SendBufferSize obtient ou définit le nombre d'octets que vous prévoyez d'envoyer dans chaque appel à la méthode NetworkStream.Write. "

    c'est pas encore la solution.

  8. #8
    Membre habitué Avatar de Apocalyps
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Août 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Août 2006
    Messages : 83
    Points : 170
    Points
    170
    Par défaut Réponse sans garanties ...
    Heu juste une petite réponse bête, et si tu réinitialisai l'objet socket après l'envoie du premier message ?

    ce qui te donnerai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    byte[] data =System.Text.Encoding.ASCII.GetBytes(trame1);
    monSocket1.Send(data, 0, data.Length,SocketFlags.None);
    monsocket1.Close()
    
    ... monsocket2 = new ...
    
    data =System.Text.Encoding.ASCII.GetBytes(trame2);
    monSocket2.Send(data, 0, data.Length,SocketFlags.None);
    monsocket2.Close()
    Et pour chaque message tu recrée un objet socket (même si tu utilise le même nom pour chaque socket à condition que tu ai bien fermé le précédent).
    SwitchSoft - Votre Vie Puissance Numérique
    Un jour, j'ai lu les C.G.U puis les C.G.V lié aux E.U.L.A pour mon P.C. et j'ai compris que j'en avais des M.E.R.D.E.S
    M.E.R.D.E.S = Maux En-diablés lors de la Relecture des Décrets des Editeurs (de logiciels) Sympathiques - Vive les Acronymes

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta solution. Elle est adaptee a mon probleme pour le moment.
    Mais cela implique que je ne pourai pas accepter plusieurs clients par la suite. En fermant le socket a chaque fois, je ne pourrai pas identifier mes clients en fonction de leur sockets.

    Je vais prendre ca pour le moment, ca me permet de continuer mes essais. Mais plus tard j'aimerai pouvoir ajouter des clients.

    Merci a tous de votre participation et de votre temps.

  10. #10
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    normalement, avec les options que tu as présentés, on peut désactiver l'algo de nagles

    Donc, noDelay devrait faire l'affaire (à moins qu'il y a une autre option à activer)

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Je pensais aussi avoir trouvé la solution. Mais le resultat n'est pas concluant

    Mais je ne vois pas la difference. Mes message arrivent quand meme groupés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
     
    using System;
    using System.Reflection;
    using System.Windows.Forms;
    using System.Net.Sockets;
    using System.Threading;
    using System.IO;
    using System.Net;
    using System.Data;
     
    namespace SEA
    {
    	public class ComEthServeur
    	{
    		#region Membres privés
     
    		private Socket monSocket;
    		private IPAddress adresse_Ip;
    		private string nom_Machine;
    		public TcpListener serveur;
    		public System.Threading.Thread threadSurveillanceTcp;
    		private Boolean arretThread;
     
    		private	Boolean isConnected;
    		public Boolean IsConnected
    		{
    			get { return isConnected; }			
    		}
     
    		private void surveille()
    		{
    			arretThread=false;			
    			try
    			{				
    				//demarage du listener
    				serveur = new TcpListener(port);
    				serveur.Start();
     
    				monSocket = serveur.AcceptSocket();
    				this.isConnected=true;
     
    				while(!arretThread)
    				{
    					if(serveur.Pending())
    						monSocket = serveur.AcceptSocket();
     
    					monSocket.SetSocketOption(System.Net.Sockets.SocketOptionLevel.Tcp, System.Net.Sockets.SocketOptionName.ReceiveBuffer, 0);
    					byte[] option = monSocket.GetSocketOption(System.Net.Sockets.SocketOptionLevel.Tcp, System.Net.Sockets.SocketOptionName.NoDelay,1);
    			//		monSocket.Send(option, 0, option.Length,SocketFlags.None);
     
     
    			//		monSocket.IOControl
     
    					if (monSocket.Available!=0)					
    						OnReceptionData(this,new System.EventArgs());					
    					Thread.Sleep(10);
    				}
    				Thread.Sleep(10);
    				this.isConnected=false;
    			}
    			catch(Exception e)
    			{
    				this.isConnected=false;
    				this.serveur.Stop();
    				threadSurveillanceTcp.Abort();
     
    				threadSurveillanceTcp = new Thread(new ThreadStart(surveille));
    				threadSurveillanceTcp.Start();
    			}
    		}
     
    		#endregion
     
    		#region Proprietés
     
    		private Boolean donneeLue;
     
    		public Boolean DonneeLue
    		{
    			get { return donneeLue; }
    		}
    		private int port= new int();
     
    		public int Port
    		{
    			get { return port; }
    			set { port = value; }
    		}		
    		#endregion	
     
    		#region Evenements
     
    		public event EventHandler OnReceptionData;
     
     
    		public event EventHandler OnClientConnected;
     
    		#endregion
     
    		#region Methodes
     
    		public ComEthServeur()
    		{		
    		}
     
    		public void Initialisation(int port)
    		{
    			this.isConnected=false;
    			//Récupération de l'adresse Ip de la machine
    			adresse_Ip = Dns.Resolve(Dns.GetHostName()).AddressList[0];
    			//Récupération du nom de la machine
    			nom_Machine = Dns.GetHostName().ToString();
     
    			//port
    			this.port=port;
     
    			//demarage thread connectionClient
    			threadSurveillanceTcp = new Thread(new ThreadStart(surveille));
    			threadSurveillanceTcp.Start();
    		}
     
    		public void Initialisation()
    		{
    			this.isConnected=false;
    			//Récupération de l'adresse Ip de la machine
    			adresse_Ip = Dns.Resolve(Dns.GetHostName()).AddressList[0];
    			//Récupération du nom de la machine
    			nom_Machine = Dns.GetHostName().ToString();
     
    			//demarage thread connectionClient
    			threadSurveillanceTcp = new Thread(new ThreadStart(surveille));
    			threadSurveillanceTcp.Start();
    		}
     
    		public Boolean Deconnection()
    		{
    			Boolean ok=true;
    			try
    			{
    				arretThread=true;
    				threadSurveillanceTcp.Abort();
     
    				this.serveur.Stop();
    				this.serveur=null;
    				monSocket = null;
    			}
    			catch(Exception e)
    			{
    				ok=false;
    			}
    			return ok;
    		}
     
     
    		public Boolean EnvoiTrame(string trame)
    		{
    			Boolean ok=true;
    			try
    			{
    				trame+=(char)10;
    				byte[] data =System.Text.Encoding.ASCII.GetBytes(trame);
    				monSocket.Send(data, 0, data.Length,SocketFlags.None);
    			}
    			catch(Exception e)
    			{
    				ok=false;
    			//	clsLog.LogErreur(e);			
    			}
    			return ok;		
    		}
     
    		public Boolean EnvoiTrame(byte[] trame)
    		{
    			Boolean ok=true;
    			try
    			{		
    		monSocket.SetSocketOption(System.Net.Sockets.SocketOptionLevel.Tcp, System.Net.Sockets.SocketOptionName.NoDelay, 1);
    				monSocket.Send(trame, 0, trame.Length,SocketFlags.None);
    			}
    			catch(Exception e)
    			{
    				ok=false;
     
    			}
    			return ok;		
    		}
     
    		public Boolean LireTrame(out string trame)
    		{
    			Boolean ok=true;
    			trame=String.Empty;
     
    			try
    			{
    				Byte[] transfert = new Byte[2048];
    				monSocket.Receive(transfert);
    				trame = System.Text.Encoding.ASCII.GetString(transfert);
    				donneeLue=true;
    				//Se produit dès que le client se déconnecte
    				if (trame.Substring(0,1)!="D")
    				{
    					serveur.Stop();
    					threadSurveillanceTcp.Abort();
    					threadSurveillanceTcp = new Thread(new ThreadStart(surveille));
    					threadSurveillanceTcp.Start();
    					threadSurveillanceTcp.Join(500);
    				}
    			}
    			catch(Exception e)
    			{
    				ok=false;
    			//	clsLog.LogErreur(e);			
    			}
    			return ok;		
    		}
     
    		public Boolean LireTrame(out byte[] trame)
    		{
    			Boolean ok=true;
    			trame = new Byte[2048];
    			try
    			{
    				monSocket.Receive(trame);
    				donneeLue=true;
     
    				//Se produit dès que le client se déconnecte
    				if ( Convert.ToChar(trame[0])!='D' )
    				{
    					serveur.Stop();
    					threadSurveillanceTcp.Abort();
    					threadSurveillanceTcp = new Thread(new ThreadStart(surveille));
    					threadSurveillanceTcp.Start();
    					threadSurveillanceTcp.Join(500);
    				}
    			}
    			catch(Exception e)
    			{
    				ok=false;
    			}
    			return ok;		
    		}
    		#endregion
    	}
    }
    Je vous forni mon code. C'est peut etre moi qui fait n'importe quoi.

  12. #12
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    et tu le fais ou le

    SetSocketOption() pour le NoDelay ? parce que dans ton code, tu fais un GetOption() et non un set pour le noDelay !!! Je me trompe ou quoi ?

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  13. #13
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Je fais un setsocketoption() dans :
    public Boolean EnvoiTrame(byte[] trame){....}

    C'est peut etre pas sa place ??

  14. #14
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Je reitère ma question, tu nous a montré un bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    monSocket.SetSocketOption(System.Net.Sockets.SocketOptionLevel.Tcp, System.Net.Sockets.SocketOptionName.ReceiveBuffer, 0);
    					byte[] option = monSocket.GetSocketOption(System.Net.Sockets.SocketOptionLevel.Tcp, System.Net.Sockets.SocketOptionName.NoDelay,1);
    Dans ce code, je vois un Set... pour le mode TCP, mais pour le no Delay, je
    lis un Get.... donc, pour moi, tu ne fais pas ton Set pour le NoDelay

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  15. #15
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Salut,

    tu as entierement raison. J'ai fais une mauvaise modification, et le nodelay a disparu. J'aurai du ecrire (enfin je crois) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     monSocket.SetSocketOption(System.Net.Sockets.SocketOptionLevel.Tcp, System.Net.Sockets.SocketOptionName.NoDelay, 0);
    mais ca ne marche pas non plus

  16. #16
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par xankow Voir le message
    Salut,

    tu as entierement raison. J'ai fais une mauvaise modification, et le nodelay a disparu. J'aurai du ecrire (enfin je crois) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     monSocket.SetSocketOption(System.Net.Sockets.SocketOptionLevel.Tcp, System.Net.Sockets.SocketOptionName.NoDelay, 0);
    mais ca ne marche pas non plus
    Je pense que ce qui est cité precedement désactive le Nodelay et active l'envoi groupé.

    Personnellement j'écrirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (System.Net.Sockets.SocketOptionLevel.Tcp, System.Net.Sockets.SocketOptionName.NoDelay, 1)

  17. #17
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci,
    j'ai suivi ton conseil.
    En fait lors de mon execution, j'ai toujours des paquets qui se colle. Je ne vois pas bien la difference dans mon application.

Discussions similaires

  1. Simulation d'envoi de mails par des packets
    Par Thibqult dans le forum Réseau
    Réponses: 6
    Dernier message: 22/09/2011, 16h45
  2. Packet UDP reçu environ 20 seconds apres l envoi dans petit Lan
    Par zouhair9 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 23/04/2010, 17h58
  3. Envoi de packet personnalisé sur réseau
    Par Kyom dans le forum C#
    Réponses: 2
    Dernier message: 09/09/2008, 10h42
  4. TCP/IP - envois de packets
    Par justgreat dans le forum Scripts/Batch
    Réponses: 14
    Dernier message: 06/11/2007, 15h05
  5. envoi de packet
    Par youp_db dans le forum Linux
    Réponses: 4
    Dernier message: 07/02/2007, 13h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo