ما هي أفضل طريقة ليجد تطبيق العميل خادمًا على شبكة محلية في C#؟

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

سؤال

يتصل العميل بالخادم باستخدام القنوات الأصلية (نحن نفكر في التبديل إلى DotNetRemoting).ما أعنيه بالبحث هو الحصول على عنوان IP ورقم المنفذ الخاص بالخادم للاتصال به.

يبدو أن أسلوب القوة الغاشمة يتمثل في تجربة كل عنوان IP على الشبكة وتجربة المنافذ النشطة (لست متأكدًا حتى مما إذا كان ذلك ممكنًا) ولكن يجب أن تكون هناك طريقة أفضل.

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

المحلول

فكر في بث حزمة UDP محددة.عندما يرى الخادم أو الخوادم حزمة UDP التي تم بثها، يرسلون ردًا.يمكن للعميل جمع الردود من جميع الخوادم والبدء في الاتصال بها أو بناءً على خوارزمية الاختيار.

انظر المثال للعميل (كود غير مجرب):


using System.Net;
using System.Net.Sockets;

[STAThread]
static void Main(string[] args)
{
    Socket socket = new Socket(AddressFamily.InterNetwork,
    SocketType.Dgram, ProtocolType.Udp);
    socket.Bind(new IPEndPoint(IPAddress.Any, 8002));
    socket.Connect(new IPEndPoint(IPAddress.Broadcast, 8001));
    socket.Send(System.Text.ASCIIEncoding.ASCII.GetBytes("hello"));

    int availableBytes = socket.Available;
    if (availableBytes > 0)
    {
        byte[] buffer = new byte[availableBytes];
        socket.Receive(buffer, 0, availableBytes, SocketFlags.None);
        // buffer has the information on how to connect to the server
    }
}

نصائح أخرى

وأود أن أقول أفضل طريقة هي استخدام صباح الخير / Zeroconf / MDNS لC #؛ ذهب الكثير من التفكير في جعلها تلعب لطيفة مع الشبكة؛ IE ذلك الأصوات أقل كثيرا مع مرور الوقت إن أمكن، وما إلى ذلك هناك Mono.Zeroconf ، وأنا أقرأ هناك مشروع. NET السن في أبل SDK لكنني لم يتم العثور عليه.

وهكذا أسهل سيكون لتثبيت صباح الخير ويندوز ، ثم الحصول على < وأ href = "http://download.banshee-project.org/mono-zeroconf/mono-zeroconf-0.8.0-binary.zip" يختلط = "noreferrer"> ويندوز ثنائيات لMono.Zeroconf محاكمة مثال MZClient.exe إسقاط Mono.Zeroconf.dll و / أو Mono.Zeroconf.Providers.Bonjour.dll إلى مراجع المشروع الخاص بك وتذهب.

وشيء من هذا القبيل:

var service = new Mono.Zeroconf.RegisterService {
                Name = "Use Me for Stuff",
                RegType = "_daap._tcp",
                ReplyDomain = "local.",
                Port = 0024200,
                TxtRecord = new Mono.Zeroconf.TxtRecord {
                            {"I have no idea what's going on", "true"}}
              };
service.Register();

var browser = new Mono.Zeroconf.ServiceBrowser();
browser.ServiceAdded +=
    delegate(object o, Mono.Zeroconf.ServiceBrowseEventArgs args) {
        Console.WriteLine("Found Service: {0}", args.Service.Name);
        args.Service.Resolved +=
            delegate(object o, Mono.Zeroconf.ServiceBrowseEventArgs args) {
                var s = args.Service;
                Console.WriteLine(
                    "Resolved Service: {0} - {1}:{2} ({3} TXT record entries)",
                    s.FullName, s.HostEntry.AddressList[0], s.Port, s.TxtRecord.Count);
          };
        args.Service.Resolve();
    };
browser.Browse("_daap._tcp", "local");

وأردت فقط أن أشير إلى البديلة حزمة Zeroconf NuGet: Zeroconf . أنه ليس لديه أي تبعيات الأم، لذلك أنت لا تحتاج إلى تثبيت صباح الخير ل Windows أو أي شيء آخر.

ولديه دعم ل. NET 4.5، WP8 وو Win8.

WS-ديسكفري هو بروتوكول يهدف لهذا الغرض. لديها عدد قليل من الاختلافات مختلفة، نكهات مختلفة من البث والوكلاء. http://en.wikipedia.org/wiki/WS-Discovery

و. NET WCF4 تنفذ هذه.

هل لديك خادم الاستماع للبث على منفذ معين على الشبكة (يجب استخدام UDP)، عندما يكون العميل يبدأ بثها بعض الطلب "بينغ" على هذا المنفذ. عندما يرى الخادم "بينغ" انه يرسلون رسالة مع عنوان TCP والمنفذ المطلوبة للعميل للاتصال به.

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