0

特定のポートへの接続時にxampp/wampベースのApacheサーバーでカスタムリクエストに応じてカスタムレスポンスを送信するにはどうすればよいですか?

クロスドメインhttpGETリクエストを許可するために、フラッシュアプ​​リがリクエストしている\0に返信しようとしています。

フラッシュポリシー要求は、デフォルトでポート843に対して行われ、そのままにしておきたいと思います。

ポートは\0(null文字で終わる\ 0は参照用です)を取得し、次のように応答する必要があります。

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
        <site-control permitted-cross-domain-policies="master-only"/>
        <allow-http-request-headers-from domain="*" headers="*" secure="true" />
      <allow-access-from domain="*" to-ports="*" />
    </cross-domain-policy>

私の知る限り、Content-typeも必要になるかもしれませんが、リクエストはプレーンテキストとして返されるはずです。

http://socketpolicyserver.com/を使用してみましたが、ポートをリッスンして接続を受け入れますが、要求に応じて指定されたxmlで応答しません。

適切な返信を達成するための方法/方法はありがたいです、

に関して、

マイク。

!---更新--->

ポート843をリッスンし、前述のポリシーを提供する単純なC#Webサーバーを作成しました。ただし、セキュア接続にSecureSocket接続を使用する場合(つまり、HTTPS / SSLプロトコルへのソケットを開く場合)は問題なく機能しました。送信されるリクエストは、ホスト証明書を使用して暗号化されます。私の知る限り、サーバー証明書をリッスンまたは取得し、外部アプリを介してデータを復号化する方法はありません。したがって、適切な要求が適切なポート。

私が持っているもう1つのアイデアは、サーバー自体で何が起こっているかに関係なく、Apacheディレクトリに格納されているサーバーの証明書ファイルを読み取ることです。

あなたのコメントを聞きたいです、

マイク。

4

1 に答える 1

0

だからこれが私が最終的にそれを解決した方法です:

私はいくつかの変更を加えてこの人のコードを使用しました:http ://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server

ポート843をリッスンし、適切なフラッシュ要求に応じてある程度一般的なポリシーを提供する単純なマルチスレッドWebサーバーを作成しました。

アドビによって提供されたいくつかの例がありましたが、何らかの理由で、ウィンドウはそれらを好きではありませんでした。

また、フラッシュのSecureSocketオブジェクトを使用している場合は、ターゲットサーバー(IIS'/ Apache' / Tomcats'など)のSSL資格情報を使用し、ターゲットサーバー証明書の公開鍵を使用してクライアント認証を開始する必要があることにも注意してください。繰り返しになりますが、このコードはSSLをサポートしていない可能性がありますが、C#のSSLストリームを使用して実装を開始しましたが、これまでのところ運がありません。SSL経由で動作させることができる場合は、お知らせください。

このコードがお役に立てば幸いです。

マイク。

using System;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.IO;

namespace TCPSexyServer
{
    class Server
{
    private TcpListener tcpListener;
    private Thread listenThread;

    private void ListenForClients(int p)
    {
        throw new NotImplementedException();
    }

    public Server()
    {
        this.tcpListener = new TcpListener(IPAddress.Any, 843);
        this.listenThread = new Thread(new ThreadStart(ListenForClients));
        this.listenThread.Start();
    }

    private void ListenForClients()
    {
        this.tcpListener.Start();

        while (true)
        {
            //blocks until a client has connected to the server
            TcpClient client = this.tcpListener.AcceptTcpClient();

            //create a thread to handle communication 
            //with connected client
            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
            clientThread.Start(client);
        }
    }

    private void HandleClientComm(object client)
    {
        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();
        byte[] message = new byte[4096];
        int bytesRead;

        while (true)
        {
            bytesRead = 0;

            try
            {
                //blocks until a client sends a message
                bytesRead = clientStream.Read(message, 0, 4096);
            }
            catch
            {
                //a socket error has occured
                break;
            }

            if (bytesRead == 0)
            {
                //the client has disconnected from the server
                break;
            }

            //message has successfully been received

            UTF8Encoding encoder = new UTF8Encoding();

            string sentData = encoder.GetString(message, 0, bytesRead);
            Console.WriteLine(sentData);
            if (sentData == "<policy-file-request/>\0")
            {
                String policy = "<?xml version=\"1.0\"?>\n" +
                                "<!DOCTYPE cross-domain-policy SYSTEM \"/xml/dtds/cross-domain-policy.dtd\">\n" +
                                "<cross-domain-policy>\n" +
                                "<site-control permitted-cross-domain-policies=\"master-only\"/>\n" +
                                "<allow-http-request-headers-from domain=\"*\" headers=\"*\" secure=\"true\" />\n" +
                                "<allow-access-from domain=\"*\" to-ports=\"*\" />\n" +
                                "</cross-domain-policy>\0";
                byte[] buffer = encoder.GetBytes(policy);
                clientStream.Write(buffer, 0, buffer.Length);
                clientStream.Flush();
                Console.WriteLine(policy);
            }
            else
            {
                tcpClient.Close();
            }
            System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
        }

        tcpClient.Close();
    }

        public static void Main(string[] args)
        {
            Server blah = new Server();
       }

    }
}
于 2012-02-26T10:23:52.070 に答える