Question

Comme une sorte de suivi de cette question J'ai une solution qui fonctionne sur mon ordinateur local, mais pas sur un ordinateur du réseau.

Je ne connais pas grand chose aux sockets, à cela, donc soyez patient. L'objectif est qu'un client recherche un serveur sur un réseau local, résultat d'un code coupé / collé / édité.

Ceci est le code 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();
    }

C'est le code du serveur:

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

Cela fonctionne sur mon ordinateur local (serveur et client), mais lorsque j'essaie d'utiliser un autre ordinateur sur le même réseau, je reçois "Une connexion existante a été fermée de force par l'hôte distant"

.

Je me rends compte que je dois ajouter beaucoup d'essayer / attraper mais j'essaie juste de comprendre comment cela fonctionne en premier.

Était-ce utile?

La solution

Je dois commencer par dire que je ne connais rien au c #, mais ...

En regardant la définition de ipep dans le code client, il semble que vous essayez de vous envoyer vos données, plutôt que de les diffuser (comme suggéré dans votre autre question) . Ce qui a attiré mon attention, c’est que " 127.0.0.1 " est l'adresse de "localhost".

Cela expliquerait pourquoi cela fonctionne bien lorsque vous exécutez le client et le serveur sur la même machine, car elle sera envoyée à lui-même.

Je m'attendrais à ce que le bon point de terminaison concerne une adresse de diffusion (par exemple, "255.255.255.255"). Vous pouvez également choisir l'adresse de diffusion du réseau local sur lequel vous vous trouvez, en fonction de l'étendue de votre réseau. souhaite diffuser.

Autres conseils

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

Devrait devenir:

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

Et

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

Devrait devenir

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

Je pense.

OK, cela ne fonctionne pas, donc quelque chose ne va pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top