Pregunta

Como una especie de seguimiento a esta pregunta Tengo una solución que funciona en mi máquina local, pero no en una máquina de la red.

No sé mucho acerca de los enchufes que no sean los básicos, así que tengan paciencia conmigo. El objetivo es que un cliente busque un servidor en una red local, y esto es el resultado de algún código de cortar / pegar / editar.

Este es el código del 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 es el código del 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);
        }

Funciona en mi máquina local (tanto el servidor como el cliente), pero cuando intento otra máquina en la misma red obtengo " El host remoto ha cerrado forzosamente una conexión existente

Me doy cuenta de que necesito agregar un montón de try / catch, pero solo estoy tratando de entender cómo funciona esto primero.

¿Fue útil?

Solución

Debo comenzar diciendo que no sé nada de C #, pero ...

Mirando la definición del ipep en el código del cliente, parece que estás intentando enviarte tus datos, en lugar de transmitirlos (como se sugirió en tu otra pregunta) . Lo que me llamó la atención fue que " 127.0.0.1 " es la dirección de " localhost " ;.

Eso explicaría por qué funciona bien cuando ejecutas el cliente y el servidor en la única máquina, ya que se se enviará a sí mismo.

Espero que el punto final correcto sea para una dirección de transmisión (por ejemplo, " 255.255.255.255 "), aunque también puede elegir la dirección de transmisión de la red local en la que se encuentra, dependiendo de cuán ampliamente Desea transmitir.

Otros consejos

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

Debería convertirse en:

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

Y

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

Debería convertirse

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

Creo.

Está bien, esto no funciona, así que algo sigue mal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top