C# Socket LocalEndPoint : spécifier un port d'envoi (coté client)

C# Socket LocalEndPoint : spécifier un port d'envoi (coté client) - C#/.NET managed - Programmation

Marsh Posté le 27-06-2006 à 18:55:59    

Bonjour à tous.
J'ai un petit pb sur les connexions socket en c#
 
J'ai un client qui se connecte sur un serveur (TCP, synchrone) via le code suivant :
 

Code :
  1. // Creation du IpEndPoint
  2. IPEndPoint myIpEndPoint = new IPEndPoint( GetIPfromDNS(ServerInfo)[0],ServerPort);
  3. // Init de la connexion
  4. this.SocketClient.BeginConnect(myIpEndPoint,new AsyncCallback(ConnectCallback),this.SocketClient);


 
La connexion est OK, les echanges se passent bien, etc etc ...
Maintenant, mon probleme est que si l'IP et le PORT du serveur sont bien défini, mon port d'envoi local est quant à lui aléatoire. Je n'arrive pas à en spécifier un de mon choix (même avec un bind !).
 
Savez vous comment forcer un port donnée au niveau client pour l'envoi des données ?
 
Merci d'avance !  :hello:
 
PS : avec le bind j'ai essayé la chose suivante mais avec cette version je n'arrive plus à me connecter au serveur
 

Code :
  1. // Initialisation de la socket de connexion sur le server
  2. this.SocketClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
  3. // Local EP
  4. System.Net.IPEndPoint myLocalEP = new IPEndPoint(GetIPfromDNS("127.0.0.1" )[0],4555);
  5. SocketClient.Bind(myLocalEP);
  6. // Remote EP
  7. IPEndPoint myIpEndPoint = new IPEndPoint( GetIPfromDNS(ServerInfo)[0],ServerPort);
  8. // Connexion  
  9. this.SocketClient.BeginConnect(myIpEndPoint,new AsyncCallback(ConnectCallback),this.SocketClient);


 
Je me doute bien que je dois me mélanger les pinceaux dans les bind et EndPoint mais je n'arrive pas à m'en dépatouiller  :cry:  :sweat:


Message édité par Sagoth le 27-06-2006 à 18:59:57
Reply

Marsh Posté le 27-06-2006 à 18:55:59   

Reply

Marsh Posté le 28-06-2006 à 11:21:47    

Ok, pour info l'erreur vient du bind sur "127.0.0.1".
Il ne gere pas l'adresse de loopback, on doit spécifier la "vraie" adresse locale "10.226.xxx.xxx".
 
Je me heurte maintenant à un autre "pb".
Il est en effet impossible apres deconnexion et fermeture d'une socket donnée de se reconnecter sur cette même socket en raison d'un temps d'attente TCP.
 
Est il possible de contourner cette limitation ?  
A priori je ne pense pas dans la mesure où c'est un des principes du TCP/IP

Reply

Marsh Posté le 28-06-2006 à 11:27:07    

ouais c'est un truc pour empecher un grand nombre de connexion / déconnexion, genre attaque DoS (il me semble).
 
Pour le coup du timeout, on peut améliorer un peu la chose avec l'option SO_LINGER des setsockopt sous MFC, peut-être que ca se retrouve sous c#

Reply

Marsh Posté le 28-06-2006 à 15:40:01    

le temps d'attente dépend du système d'exploitation. Il n'est donc pas possible de contourner ce problème.  
 
Ce temps est nécessaire tout simplement pour être sure que tout les paquets qui aurait pu être envoyé sur le réseau soit bien détruit avant une nouvelle connection.

Reply

Marsh Posté le 29-06-2006 à 13:58:42    

Ok, thx pour les précisions messieurs  :jap:  
 
Disons que mon soucis est qu'en cas de déconexion sauvage (genre coupure réseau) le serveur en face (sur lequel je n'ai pas la main) ne déconnecte pas le client.
 
Du coup je voudrais contourner le problème en forçant de mon coté une déconnexion de celui ci au niveau serveur mais là encore je pense que c'est mort, dans la mesure ou pour le deconnecter il faudrait que je me ... reconnecte avec la meme socket (ce qui ne passera pas) :whistle:  :sarcastic:  :o.


Message édité par Sagoth le 29-06-2006 à 14:01:16
Reply

Marsh Posté le 29-06-2006 à 22:24:27    

normalement, si le serveur est bien programmé, il vera tout de suis la déconnexion :S

Reply

Marsh Posté le 03-07-2006 à 20:22:39    

moi23372 a écrit :

si le serveur est bien programmé


 
 :pfff:  :lol:  
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed