Frage

Als Art eines Followup auf diese Frage ich eine Lösung auf meinem lokalen Rechner arbeitet bekommen haben, aber nicht auf einem Computer im Netzwerk.

Ich weiß nicht, zu viel über Steckdosen anders als das Wesentliche, so mit mir tragen. Das Ziel ist, ein Client für einen Server in einem lokalen Netzwerk zu suchen, und das ist das Ergebnis einer Ausschneiden / Einfügen / Bearbeiten von Code.

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 Server-Code:

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 findet (Server und Client), aber wenn ich eine andere Maschine auf dem gleiche Netzwerk versuche ich „Eine bestehende Verbindung wurde gewaltsam geschlossen von der Remote-Host“

erhalten

Ich weiß, ich brauche viel try / catch hinzufügen, aber ich versuche nur, einen Griff zu bekommen, wie das funktioniert, zuerst.

War es hilfreich?

Lösung

Zunächst muss ich sagen, dass ich nichts über C # weiß, aber ...

Mit Blick auf die Definition des ipep im Client-Code, es sieht aus wie Sie versuchen, Ihre Daten an sich selbst zu senden, anstatt Broadcast es (wie in der anderen Frage vorgeschlagen). Die Sache, die meine Aufmerksamkeit erregt war, dass „127.0.0.1“ ist die Adresse „localhost“.

Das würde erklären, warum es gut funktioniert, wenn Sie sowohl den Client und Server auf einer Maschine laufen lassen, wie es wird an sich selbst sendet werden.

Ich würde erwarten, dass die korrekte Endpunkt für eine Broadcast-Adresse sein würde (zB „255.255.255.255“.) - Sie können sie aber auch die Broadcast-Adresse des lokalen Netzwerks wählen könnten, die Sie auf sind, je nachdem, wie weit Sie möchten Sendung.

Andere Tipps

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

Sollte werden:

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")));

Sollte Werden

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

denke ich.

OK, das nicht funktioniert, so etwas ist immer noch falsch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top