2009-12-11 9 views
0

doublons possibles:UDP Response ou Receiving a response through UDPEnvoi paquet UDP vers le serveur et obtenir une réponse

J'ai écrit une configuration client-serveur udp au cours du dernier mois et avoir un serveur de travail. Ce serveur est destiné à être un programme de communication pour récupérer des données sur l'ordinateur sur lequel il a été hébergé, sur demande d'un ordinateur client distant. L'idée générale est décrit ci-dessous:

client ->demandes de données -> Serveur -> processus demander ->envoie une réponse -> Client

Et le client reçoit le données et fait ce dont il a besoin avec ces données.

Je suis capable de tout faire dans ce plan, sauf si le client reçoit les paquets et les envoie à ma console de test. Si vous voulez voir la classe UdpServer, c'est simple, mais faites juste un commentaire et je l'afficherai ici dans une édition.

Voilà comment je reçois des données (application de test):

exécute: "test.exe index de tableau < >", par exemple « Test.exe 4 » -> contre exécute 204.229.219.35

public class Program { 
    static void Main(String[] args) { 
     string pre = "204.229.219"; 
     string[] servers = { 
           "31", "32", "33", "34", "35", "36", 
           "37", "38", "39", "40", "41", "42", 
           "88", "89" 
          }; 

     if (args.Length < 1) 
     { 
      Environment.Exit(1); 
     } 

     int idx = Int32.Parse(args[0]); 

     Console.Title = "UDPSERVERTEST"; 

     UdpClient c = new UdpClient(); 

     Byte[] data = Encoding.ASCII.GetBytes("net user"); 

     IPEndPoint ep = new IPEndPoint(Dns.GetHostEntry(String.Format("{0}.{1}", pre, servers[idx])).AddressList[0], 8915); 

     Console.WriteLine("\tQuerying: {0}", String.Format("{0}.{1}", pre, servers[idx])); 

     c.Send(data, data.Length, ep); 

     UdpState s = new UdpState(); 
     s.endPoint = new IPEndPoint(IPAddress.Any, 0); 
     s.host = c; 
     s.encoding = Encoding.ASCII; 
     ReceiveCallback(s); 

     Console.ReadKey(true); 
    } 

    private static void ReceiveCallback(UdpState s) 
    { 
     byte[] data = s.host.Receive(ref s.endPoint); 
     Console.WriteLine("Data received from ({0}) -> {1}", s.endPoint.ToString(), s.encoding.GetString(data)); 
    } 

    private static void callback(IAsyncResult ar) 
    { 
     UdpState s = (UdpState)ar.AsyncState; 
     UdpClient u = s.host; 
     IPEndPoint e = s.endPoint; 

     byte[] data = u.EndReceive(ar, ref e); 
    } 
} 

Sur l'une de mes méthodes de réception, je reçois une erreur comme ce qui suit:

Une connexion existante a été fermée par la force la hôte distant

Merci Stackoverflow!

+0

Cette erreur indique généralement que le port n'est pas accessible sur le serveur, avez-vous vérifié le pare-feu pour vous assurer qu'il autorise les connexions entrantes? – Rory

+0

Je l'ai fait sur les deux mêmes machines pour le mois dernier et pour le moment je suis juste un peu distant (en pensée) pour comprendre comment recevoir des paquets de réponse à partir d'un serveur que je interroge. – Zack

Répondre

0

Pouvez-vous vérifier que votre programme de texte obtient l'événement "Recevoir des données" pour déclencher? Si vous ne recevez pas quoi que ce soit à la sortie sur votre banc d'essai, il y a deux problèmes possibles:

  1. La réponse est bloquée par un pare-feu, mais vous le faire sonner comme cela fonctionne sur d'autres ordinateurs, donc je supposons que ce n'est pas le problème.
  2. Votre événement de réception de données ne se déclenche pas. Cela peut être dû au fait que votre objet de port de données n'est pas configuré correctement. Sans plus d'informations sur la façon dont vous faites cela, ce serait mon meilleur pari.

Ce que je ferais, c'est de confirmer que votre événement se déclenchera en premier. Si votre objet de port de données n'est pas configuré correctement, cela peut facilement être votre problème entier. Si cela est correctement configuré, confirmez que votre serveur envoie une réponse. Il se peut que ce ne soit pas un envoi et une réponse et, par conséquent, votre client n'en reçoit pas.