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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top