C# Socket Policy File Server لاتصالات AS3.0 Socket ذات المستوى المنخفض؟

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

سؤال

كيف يمكنني عمل خادم ملفات سياسة المقبس في C#. كل ما يتعين عليه فعله هو الاستماع إلى المنفذ 843 للسلسلة "u003Cpolicy-file-request/> "تليها بايت فارغ ثم إرجاع سلسلة XML (وهو ملف سياسة المقبس).

لم أشفر هذا النوع من الأشياء من قبل وأنا غير متأكد من أين أبدأ. هل أقوم بإنشائها في خدمة Windows؟ أي نصائح أو روابط مرحب بها.

خلفية:

للاتصال بخدمة الويب من Flash ، أستخدم مكتبة "AS3HTTPCLIENT" بدلاً من urlrequest/urlloader. هذا لأنه يعطيني القدرة على إرسال رؤوس مخصصة مع طلبات الحصول على. تستخدم هذه المكتبة مآخذ منخفضة المستوى للقيام بأشياءها.

عندما يستخدم Flash مآخذ منخفضة المستوى للاتصال بخادم ، فإنه يبحث عن ملف سياسة المقبس - ويجب تقديم هذا بواسطة خادم ملفات سياسة المقبس.

مقالة ملف سياسة المقبس من Adobe

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

المحلول

بعض الأشياء التي يجب أن تكون على دراية باستخدام بنيةك المقترحة:

محاولة إرسال طلب HTTP عبر مآخذ

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

من أجل إنشاء خادم سياسة ، يمكنك استخدام tcplistener صف دراسي. سوف تبدأ الاستماع على النحو التالي:

var tcpListener = new TcpListener(IPAddress.Any, 843 );
tcpListener.start();
tcpListener.BeginAcceptTcpClient(new AsyncCallback(NewClientHandler), null);

طريقة NewClientHandler سيكون لها النموذج:

    private void NewClientHandler(IAsyncResult ar)
    {
        TcpClient tcpClient = tcpListener.EndAcceptTcpClient(ar);
        ...

عند هذه النقطة ، قد ترغب في تزويد كائن TCPClient بفئة من إنشائك الخاصة للتعامل مع التحقق من صحة البيانات القادمة من المقبس. سأسميها RemotEclient.

في RemoteClient ، سيكون لديك شيء مثل هذا:

    var buffer=new byte[BUFFER_SIZE];
    tcpClient.GetStream().BeginRead(buffer, 0, buffer.Length, Receive, null);

وطريقة استلام:

    private void Receive(IAsyncResult ar)
    {
        int bytesRead;
        try
        {
            bytesRead = tcpClient.GetStream().EndRead(ar);
        }
        catch (Exception e)
        {

            //something bad happened. Cleanup required
            return;
        }

        if (bytesRead != 0)
        {
            char[] charBuffer = utf8Encoding.GetChars(buffer, 0, bytesRead);
            try
            {
                tcpClient.GetStream().BeginRead(buffer, 0, buffer.Length, Receive, null);
            }
            catch (Exception e)
            {
                //something bad happened. Cleanup required
            }
        }
        else
        {
            //socket closed, I think?
            return;
        }
    }

وبعض الطرق يرسل:

    public void Send(XmlDocument doc)
    {
        Send(doc.OuterXml);
    }
    private void Send(String str)
    {

        Byte[] sendBuf = utf8Encoding.GetBytes(str);
        Send(sendBuf);
    }
    private void Send(Byte[] sendBuf)
    {
        try
        {
            tcpClient.GetStream().Write(sendBuf, 0, sendBuf.Length);
            tcpClient.GetStream().WriteByte(0);
            tcpClient.GetStream().WriteByte(13); //very important to terminate XmlSocket data in this way, otherwise Flash can't read it.

        }
        catch (Exception e)
        {
            //something bad happened. cleanup?
            return;
        }
    }

هذا هو كل التفاصيل المهمة على ما أعتقد. لقد كتبت هذا منذ بعض الوقت ... تبدو طريقة الاستقبال كما يمكن أن تفعل مع إعادة صياغة ، ولكن يجب أن تكون كافية لتبدأ.

نصائح أخرى

قم بإنشاء مقبس الاستماع.

عند فتح اتصال ، قم بإجراء استلام وانتظر السلسلة المتوقعة. عند استلامها ، أرسل محتوى الملف ثم أغلق المقبس.

لف هذا في الخدمة (تعمل كحساب امتياز منخفض).

يتم تنفيذ معظم العمل مع System.net.sockets.socket الفئة ، تحتوي الوثائق على عينة ، فإن واجهة برمجة التطبيقات تشبه إلى حد كبير واجهة برمجة تطبيقات Socket BSD بشكل عام (إلى حد كبير هناك رسم خرائط 1: 1 من API BSD إلى Socket (أو نوع المساعدة)) لذلك يجب ترجمة أي خلفية بسهولة.

اضطررت إلى هذه المهمة مع كل من Java و C#، فهي متشابهة تمامًا.

يمكنك إلقاء نظرة على ملف سياسة جافا.

يمكن أن ترى بعض المشكلات في هذه الإجابة: https://stackoverflow.com/a/12854204/1343667

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