0

C# でソケット ポリシー ファイル サーバーを作成するにはどうすればよいですか。ポート 843 で文字列 "<policy-file-request/>" とそれに続く NULL バイトをリッスンし、XML 文字列 (ソケット ポリシー ファイル) を返すだけです。

私は以前にこの種のコードを作成したことがなく、どこから始めればよいかわかりません。Windows サービスで作成しますか? ヒントやリンクは大歓迎です。

バックグラウンド:

フラッシュから Web サービスに接続するために、URLRequest/URLLoader の代わりに「as3httpclient」ライブラリを使用しています。これは、GET 要求でカスタム ヘッダーを送信できるようになるためです。このライブラリは、低レベルのソケットを使用して処理を行います。

フラッシュが低レベルのソケットを使用してサーバーに接続する場合、ソケット ポリシー ファイルを探します。これは、ソケット ポリシー ファイル サーバーによって提供される必要があります。

Adobe のソケット ポリシー ファイルの記事

4

3 に答える 3

8

提案されたアーキテクチャを使用する際に注意すべき点がいくつかあります。

ソケット経由で 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);

および Receive メソッド:

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

それが私が考えるすべての重要な詳細です。これは少し前に書きました... Receive メソッドは手直しが必要なように見えますが、始めるには十分なはずです。

于 2009-09-11T09:13:35.270 に答える
1

リスニング ソケットを作成します。

接続が開かれると、受信を実行し、予想される文字列を待ちます。受信したら、ファイルの内容を送信し、ソケットを閉じます。

これをサービスにラップします (権限の低いアカウントとして実行)。

ほとんどの作業はSystem.Net.Sockets.Socketクラスで行われます。ドキュメントにはサンプルが含まれています。API は全体的に BSD ソケット API に非常に似ています (大部分は BSD API からソケットへの 1:1 マッピングがあります (またはhelp type) method) であるため、背景は簡単に翻訳できる必要があります。

于 2009-09-11T09:14:39.853 に答える
0

Java と C# の両方でこのタスクを実行する必要がありましたが、それらは非常に似ています。

Java ポリシー ファイルを確認できます。

この回答でいくつかの問題を見ることができます: https://stackoverflow.com/a/12854204/1343667

于 2012-10-12T07:29:32.690 に答える