2008-10-17 10 views
6

Als eine Art von Follow-up zu this question Ich habe eine Lösung auf meinem lokalen Rechner, aber nicht auf einer Maschine im Netzwerk arbeiten.Brauchen Sie Hilfe mit Multicast-UDP-Server-Erkennung in C#

Ich weiß nicht zu viel über Sockets außer diesen Grundlagen, also ertragen Sie mit mir. Das Ziel ist, dass ein Client nach einem Server in einem lokalen Netzwerk sucht, und dies ist das Ergebnis eines Codes zum Ausschneiden/Einfügen/Bearbeiten.

Dies ist der Client-Code:

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294); 

    byte[] data = new byte[1024]; 
    public Form1() 
    { 
     InitializeComponent(); 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

     Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10); 
     string welcome = "What's your IP?"; 
     data = Encoding.ASCII.GetBytes(welcome); 
     client.SendTo(data, data.Length, SocketFlags.None, ipep); 
     IPEndPoint server = new IPEndPoint(IPAddress.Any, 0); 
     EndPoint tmpRemote = (EndPoint)server; 
     data = new byte[1024]; 
     int recv = client.ReceiveFrom(data, ref tmpRemote); 
     this.IP.Text = ((IPEndPoint)tmpRemote).Address.ToString(); //set textbox 
     this.Port.Text = Encoding.ASCII.GetString(data, 0, recv); //set textbox 
     client.Close(); 
    } 

Dies ist der Code-Server:

int recv; 
     byte[] data = new byte[1024]; 
     IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 10294); 
     Socket newsock = new Socket(AddressFamily.InterNetwork, 
       SocketType.Dgram, ProtocolType.Udp); 
     newsock.Bind(ipep); 
     newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any,IPAddress.Parse("127.0.0.1"))); 

     while (true) 
     { 
      Console.WriteLine("Waiting for a client..."); 
      IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 
      EndPoint tmpRemote = (EndPoint)(sender); 
      data = new byte[1024]; 
      recv = newsock.ReceiveFrom(data, ref tmpRemote); 
      Console.WriteLine("Message received from {0}:", tmpRemote.ToString()); 
      Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 
      string welcome = "7010"; 
      data = Encoding.ASCII.GetBytes(welcome); 
      newsock.SendTo(data, data.Length, SocketFlags.None, tmpRemote); 
     } 

Es funktioniert auf meinem lokalen Rechner finden (Server und Client), aber wenn ich versuche, eine andere Maschine auf das gleiche Netzwerk bekomme ich "Eine bestehende Verbindung wurde zwangsweise durch den Remote-Host geschlossen"

Ich weiß, ich muss eine Menge Versuch/Fang hinzufügen, aber ich versuche nur, einen Griff zu bekommen, wie das funktioniert f Erstens.

Antwort

3

ich mit den Worten beginnen müssen, dass ich nichts über C# weiß, aber ...

bei der Definition der Suche des ipep im Client-Code, es sieht aus wie Sie versuchen, Ihre Daten an sich selbst zu senden , anstatt es zu senden (wie in Ihrer anderen Frage vorgeschlagen wurde). Die Sache, die meine Aufmerksamkeit auf sich zog, war, dass "127.0.0.1" die Adresse von "localhost" ist.

Das würde erklären, warum es gut funktioniert, wenn Sie sowohl den Client als auch den Server auf dem einen Rechner betreiben, da es an sich selbst sendet.

Ich würde erwarten, dass der richtige Endpunkt wäre für eine Broadcast-Adresse (z. B. "255.255.255.255") - obwohl Sie auch die Broadcast-Adresse des lokalen Netzwerks wählen können, die Sie sind, je nachdem, wie weit Sie wünschen übertragen.

+0

Yeah, im Nachhinein, nachdem Sie erwähnt, dass das Sinn macht, zu der Zeit (da dies ist meist Kopieren/Einfügen Code) Ich nahm an, dass war, wo ich sendete, die natürlich, wenn ich aufhörte, darüber nachzudenken mehr macht keinen Sinn, wo ich sende. – Davy8

+0

Ich werde es nicht bis Montag ausprobieren können, aber ich werde +1 und akzeptieren, wenn das funktioniert! – Davy8

-1
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294); 

Sollte sich:

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 10294); 

Und

newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("127.0.0.1"))); 

newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("255.255.255.255"))); 

Ich denke werden sollte.

OK, das funktioniert nicht, also stimmt etwas immer noch nicht.