Brauchen Sie Hilfe mit multicast-udp-server-Entdeckung in c#
Als eine Art Nachtrag zu diese Frage habe ich mittlerweile ein Lösung funktioniert auf meinem lokalen Rechner, aber nicht auf einer Maschine im Netzwerk.
Ich weiß nicht allzu viel über sockets andere als die Grundlagen, so mit mir tragen. Das Ziel ist es, für einen Kunden zu suchen, der einen server auf einem lokalen Netzwerk, und das ist das Ergebnis von einigen 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 finden Sie auf meiner lokalen Maschine (server und client), aber wenn ich versuche an einem anderen Rechner im selben Netzwerk, ich habe die Meldung "Eine vorhandene Verbindung wurde zwangsweise geschlossen durch remote-host"
Ich merke, ich muss noch eine Menge von try/catch, aber ich bin nur versuchen, in den Griff zu bekommen, wie das funktioniert ersten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Muss ich sagen, dass ich weiß nichts über C#, aber...
Blick auf die definition des
ipep
im client-code, es sieht aus wie Sie versuchen, senden Sie Ihre Daten an sich, sondern als broadcast (wie vorgeschlagen wurde, in Ihrer anderen Frage). Die Sache, die meine Aufmerksamkeit gefangen war, dass "127.0.0.1" die Adresse "localhost".Das würde erklären, warum es funktioniert gut, wenn Sie laufen client und server auf einer Maschine, wie es wird senden selbst.
Ich würde erwarten, dass der richtige Endpunkt wäre für eine broadcast-Adresse (zB. "255.255.255.255") - obwohl Sie können auch wählen Sie die broadcast-Adresse des lokalen Netzwerks, dass Sie, je nachdem, wie stark Sie wünschen, zu übertragen.
Werden sollte:
Und
Werden Sollte
Denke ich.
OK, das funktioniert nicht, so etwas ist immer noch falsch.