Domanda

Come una sorta di seguito a questa domanda Ho ottenuto una soluzione funzionante sul mio computer locale, ma non su un computer della rete.

Non so molto di prese diverse da quelle di base, quindi abbiate pazienza. L'obiettivo è che un client cerchi un server su una rete locale e questo è il risultato di un codice di taglia / incolla / modifica.

Questo è il codice client:

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();
    }

Questo è il codice del server:

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

Funziona trova sul mio computer locale (sia server che client) ma quando provo un altro computer sulla stessa rete ottengo " Una connessione esistente è stata forzatamente chiusa dall'host remoto "

Mi rendo conto che devo aggiungere un sacco di try / catch, ma sto solo cercando di capire come funziona prima.

È stato utile?

Soluzione

Devo iniziare dicendo che non so nulla di C #, ma ...

Osservando la definizione di ipep nel codice client, sembra che tu stia cercando di inviare i tuoi dati a te stesso, piuttosto che trasmetterli (come è stato suggerito nell'altra tua domanda) . La cosa che ha attirato la mia attenzione è stata che "127.0.0.1" è l'indirizzo di " localhost " ;.

Ciò spiegherebbe perché funziona bene quando si esegue sia il client che il server su un unico computer, poiché verrà inviato a se stesso.

Mi aspetto che l'endpoint corretto sia per un indirizzo di trasmissione (ad es. "255.255.255.255"), anche se potresti anche scegliere l'indirizzo di trasmissione della rete locale su cui ti trovi, a seconda della larghezza desidera trasmettere.

Altri suggerimenti

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

Dovrebbe diventare:

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

Dovrebbe diventare

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

Penso.

OK, questo non funziona, quindi qualcosa è ancora sbagliato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top