2009-10-22 9 views
2

J'utilise des sockets C# synchrones très simples pour une affectation. L'affectation consiste à créer un programme de chat peer-to-peer, de sorte que chaque instance doit fonctionner à la fois comme client et comme serveur. fonctionne Mon grand programme quand je l'ai mis en mode écoute: (StateBall est un objet qui passe des variables d'état autour)Vérifiez si une socket est connectée avant d'envoyer des données

public void startListening() 
{ 
    lState = new StateBall(); 
    IPEndPoint peer = new IPEndPoint(StateBall.host, StateBall.port); 
    lSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,  
    ProtocolType.Tcp); 

    try 
    { 
     lSocket.Bind(peer); 
     lSocket.Listen(10); 
     Console.WriteLine("Waiting for a connection..."); 

     StateBall.updateText("Waiting for a Connection..."); 

     client = lSocket.Accept(); 
     StateBall.toSend=StateBall.ourName; 

     StateBall.updateText("Connection made! Sending our name..."); 
... 

Mais quand je tente de démarrer une deuxième instance et se connecter à une instance déjà en cours d'exécution, il se bloque juste et ne se connecte pas.

D'après ce que j'ai vu sur ce site et le reste du Web que je pouvais vérifier une connexion pré-existante en utilisant quelque chose comme:

try{ 
    lsocket.Connect(peer); 
} 
catch(Exception ex){ 
    //check for SocketException type and errors 
} 

Et puis continuer avec mon programme, mais est-il un moyen propre d'intégrer cette vérification initiale dans le code déjà existant? Ou existe-t-il un meilleur moyen de vérifier un hôte actif avant d'essayer d'appeler Connect sur mon objet socket?

Répondre

1

Vous pouvez et devez probablement gérer plusieurs connexions simultanées. Appelez simplement accept dans une boucle et envoyez les clients sur des threads séparés. Je suppose que vous n'utilisez qu'un seul thread, donc lorsque le serveur est occupé avec une connexion client, le serveur expire.

Questions connexes