Precisa de ajuda com a descoberta de servidor udp multicast em c #
Pergunta
Como uma espécie de continuação a esta questão Eu recebi uma solução de trabalho na minha máquina local, mas não em uma máquina na rede.
Eu não sei muito sobre que não o básico soquetes, para ter comigo. O objetivo é que um cliente para procurar um servidor em uma rede local, e este é o resultado de algum / colar / code editar corte.
Este é o código do cliente:
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();
}
Este é o código do servidor:
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);
}
Ele funciona encontrar na minha máquina local (servidor e cliente), mas quando eu tento outra máquina na mesma rede eu recebo "Uma conexão existente forçosamente foi fechada pelo host remoto"
Eu percebo que eu preciso adicionar um monte de try / catch, mas eu só estou tentando obter uma alça sobre como isso funciona em primeiro lugar.
Solução
Eu tenho que começar por dizer que eu não sei nada sobre C #, mas ...
Olhando para a definição do ipep
no código do cliente, parece que você está tentando enviar seus dados para si mesmo, em vez de transmiti-lo (como foi sugerido na sua outra pergunta). A única coisa que me chamou a atenção foi que "127.0.0.1" é o endereço de "localhost".
Isso explicaria por que ele funciona muito bem quando você estiver executando o cliente eo servidor na uma máquina, como irá ser enviando para si.
Eu esperaria que endpoint correta seria para um endereço de broadcast (por exemplo, "255.255.255.255".) - embora você também pode escolher o endereço de broadcast da rede local que você está, dependendo de como amplamente que você deseja broadcast.
Outras dicas
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);
Deve tornar-se:
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 10294);
E
newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("127.0.0.1")));
Se Tornar
newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("255.255.255.255")));
eu acho.
OK, isso não funciona, então algo está ainda errado.