2011-04-16 5 views
0

Je veux démarrer mon programme plusieurs fois et chaque instance essaie de se connecter avec TCP au même port de serveur. Ce que j'ai l'intention est de laisser le premier se connecter et les autres clients restants devraient essayer de se connecter à un port différent.Condition de concurrence du port TCP?

J'utiliser ce code pour se connecter:

TcpClient tcp; 
StreamReader streamReader; 
StreamWriter streamWriter; 

bool success=false; 
while (!success) { 
    try 
    { 
    tcp = new TcpClient(Hostname, currentPort); 

    streamReader = new StreamReader(tcp.GetStream()); 
    streamWriter = new StreamWriter(tcp.GetStream()); 
    success=true; 
    } catch { 
    // wait a bit... 
    } 
} 

Maintenant, le premier se connecter avec succès, mais la seconde on n'obtient pas une exception, mais aussi n'est pas connecté. Comment puis-je déterminer si un programme est vraiment connecté? La propriété tcp.Connected n'a pas fonctionné.

+0

Vous devriez voir ce post. http://stackoverflow.com/questions/570098/in-c-how-to-check-if-a-tcp-port-is-available – Nix

+0

@Nix: Oui, j'utilise déjà ce code mais il y a encore une condition de concurrence car les deux programmes tentent de se connecter après avoir obtenu l'information que le port est disponible. – Michael

Répondre

0

La propriété connectée peut parfois renvoyer true si elle n'est pas réellement connectée. Voir msdn TcpClient.Connected:

Parce que la propriété Connected ne reflète que l'état de la connexion comme de l'opération la plus récente, vous devriez essayer d'envoyer ou de recevoir un message pour déterminer l'état actuel. Après l'échec de l'envoi du message, cette propriété ne renvoie plus true. Notez que ce comportement est inhérent à la conception. Vous ne pouvez pas tester de manière fiable l'état de la connexion car, entre le test et un envoi/réception, la connexion a pu être perdue. Votre code doit assumer la prise est connecté, et grâce gérer les transmissions échouées

Je vous suggère programaticaly check de voir si le port est disponible, au lieu de compter sur les exceptions.

Et pour le rendre vraiment simple pour vous, puisque vous ne pouvez pas compter sur le drapeau Connected, les gens suggèrent généralement que vous utilisez un modèle trouvé ici TcpClient.Connected True, yet not connected:

Questions connexes