بحاجة إلى مساعدة مع اكتشاف الملقم UDP الإرسال المتعدد في ج #

StackOverflow https://stackoverflow.com/questions/214009

  •  03-07-2019
  •  | 
  •  

سؤال

وأما نوع من متابعة ل<لأ href = "https://stackoverflow.com/questions/210446/what-is-the-best-way-for-a-client-app-to-find-a- الخادم على اساس واحد المحلية الشبكة في وج "> هذا السؤال لقد حصلت على حل أعمل على الجهاز المحلي، ولكن ليس على جهاز على الشبكة.

وأنا لا أعرف الكثير عن مآخذ أخرى غير تلك الأساسيات، بحيث تتحمل معي. والهدف هو عميل للبحث عن الخادم على الشبكة المحلية، وهذا هو نتيجة لبعض قطع / لصق / تحرير التعليمات البرمجية.

وهذا هو رمز العميل:

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

وهذا هو رمز الخادم:

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

ويعمل العثور على آلة المحلية (سواء الخادم والعميل) ولكن عندما أحاول جهاز آخر على نفس الشبكة أحصل على "تم إغلاق اتصال موجود بالقوة المضيف البعيد"

وأنا أدرك أنني بحاجة إلى إضافة الكثير من حاول / catch ولكن أنا مجرد محاولة للحصول على التعامل مع كيف يعمل هذا أولا.

هل كانت مفيدة؟

المحلول

لا بد لي من أن أبدأ بالقول أن أعرف شيئا عن C #، ولكن ...

وإذا نظرنا إلى تعريف ipep في رمز العميل، يبدو أنك تحاول إرسال البيانات لنفسك، بدلا من بث ذلك (كما اقترح في سؤال آخر الخاص بك). كان الشيء الذي لفت انتباهي أن "127.0.0.1" هو عنوان "مضيف".

وهذا من شأنه أن يفسر لماذا كان يعمل بشكل جيد عندما كنت تشغل كل من العميل والخادم على جهاز واحد، لأنه سوف ترسل إلى نفسها.

وأتوقع أن نقطة النهاية الصحيحة سيكون لعنوان البث (على سبيل المثال "255.255.255.255".) - على الرغم من أنك يمكن أيضا اختيار عنوان البث للشبكة المحلية التي كنت على، اعتمادا على كيفية نطاق واسع كنت ترغب في البث.

نصائح أخرى

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

وإذا أصبح:

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

و

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

وينبغي أن يصبح

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

وعلى ما أعتقد.

حسنا، هذا لا يعمل، لذلك شيء لا يزال خطأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top