0

Win-7 ラップトップと Samsung スマートフォン (Bada OS 2.0) の間に Wi-Fi を介したアドホック ネットワーク接続を既に作成しています。また、IP アドレスを検証し、ラップトップからスマートフォンに ping を実行して、接続を確認しました。

ここで、Win-7 に常駐し、ポート 8080 でスマートフォンからの HTTP 要求を受け入れ、インターネットから Web ページを取得し、それをスマートフォンに返すプロキシ サーバーを作成したいと考えています。アイデアは 2 つあります。スマートフォンでインターネットにアクセスすることと、モバイル デバイスに関するネットワーク プログラミングを学ぶことです。TCPListener を実装して要求を受信し、応答を送り返す次の c-sharp コードを作成しました。これは完全に正常に行われています。

        private void listen()
    {
        try
        {
            listener.Start();
            while (true)
            {
                Socket client= listener.AcceptSocket();
                ProcessClient(client);
            }
        }
        catch (ThreadAbortException ex)
        {
            WriteLog("Error occured: " + ex.Message);
        }
    }

    private void ProcessClient(Socket client)
    {
        //extract client data
        byte[] bytes=new byte[1024];
        int size = client.Receive(bytes, bytes.Length, SocketFlags.None);

        string clientmessage = System.Text.Encoding.ASCII.GetString(bytes);

        if (size == 0)
            return;

        int index1  = clientmessage.IndexOf(@" ");
        int index2 = clientmessage.IndexOf(@" ", index1 + 1);
        if (index1 == -1 || index2 == -1)
        {
            throw( new Exception());
        }

        //extract client url
        string part1 = clientmessage.Substring(index1 + 1, index2 - index1);
        int index3 = part1.IndexOf(@"/", index1 + 8);
        int index4 = part1.IndexOf(@" ", index1 + 8);
        int index5 = index4 - index3;
        string sURL= part1.Substring(index1 + 4, part1.Length - index5 - 8);

        //send request to web server
        IPHostEntry serverHost = Dns.GetHostEntry(sURL);
        string[] aliases = serverHost.Aliases;
        IPAddress[] addresses = serverHost.AddressList;
        IPEndPoint serverEP = new IPEndPoint(addresses[0], 80);
        Socket server = new Socket((addresses[0].AddressFamily), SocketType.Stream, ProtocolType.Tcp);
        server.Connect(serverEP);

        //server.Send(bytes, bytes.Length, SocketFlags.None);
        byte[] sendbytes = new byte[1024];
        size = System.Text.Encoding.ASCII.GetBytes(clientmessage, 0, clientmessage.Length, sendbytes, 0);
        server.Send(sendbytes, sendbytes.Length, SocketFlags.None);
        //server.Send(System.Text.ASCIIEncoding.ASCII.GetBytes(clientmessage), System.Text.ASCIIEncoding.ASCII.GetByteCount(clientmessage), SocketFlags.None);

        //read response from web server
        byte[] rbytes = new byte[4096];
        string strPage = "";
        size = 1;
        while (size > 0)
        {
            size = server.Receive(rbytes, rbytes.Length, SocketFlags.None);
                strPage += System.Text.Encoding.ASCII.GetString(rbytes,0,size);
        }
        server.Shutdown(SocketShutdown.Both);
        server.Close();

        //send the page back to the client
        //bytes = System.Text.Encoding.ASCII.GetBytes(strPage);
        bytes = new byte[strPage.Length+1];
        size = System.Text.Encoding.ASCII.GetBytes(strPage,0,strPage.Length,bytes,0);
        client.Send(bytes, size, SocketFlags.None);
    }

上記のコードは、クライアント (スマートフォン ブラウザー) からリクエストを取得し、リクエスト ヘッダー部分を取得して Web サーバーに渡し、同じクライアント ソケットを介してスマートフォンに応答を中継します。これは問題なく起こっています。問題は、Web サーバーが「Bad Request - Status code 400」という応答を送信していることです。2 つのエンドポイント間でリクエストをやり取りしているだけなので、これが起こっていることに驚いています。これについていくつかの光を共有できますか?以下は、変数 clientmessage と strPage をそれぞれ取得して取得した、送信された要求ヘッダーと受信された応答ヘッダーです。

リクエスト:

GET http://prahlad-tosh/welcome.png HTTP/1.1
Proxy-Connection: Keep-Alive
Host: prahlad-tosh
Accept: text/html, application/xml, image/vnd.wap.wbmp, image/png, image/jpeg, image/gif, image/bmp, application/vnd.wap.xhtml+xml, application/xhtml+xml, application/vnd.wap.multipart.mixed, multipart/mixed, application/vnd.oma.dd+xml, text/vnd.sun.j2me.app-descriptor, application/java-archive, application/vnd.youtube, */*
Accept-Language: en
X-Wap-Proxy-Cookie: none
Accept-Charset: utf-8;q=1.0,iso-8859-1;q=0.6
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S5380K/S5380KDDKK6; U; Bada/2.0; en-us) AppleWebKit/534.20 (KHTML, like Gecko) Dolfin/3.0 Mobile HVGA SMM-MMS/1.2.0 OPN-B
Referer: `http://prahlad-tosh/`

応答:

HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
Date: Tue, 19 Jun 2012 14:10:14 GMT
Connection: close
Content-Length: 326
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/htm/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Verb</h2>
<hr><p>HTTP Error 400. The request verb is invalid.</p>
</BODY></HTML>
4

1 に答える 1

1

編集:問題はおそらくサーバーにあると思います。代わりにApacheを使用したり、google.comに接続したりするのはどうですか?

http://prahlad-tosh補足: GETリクエストの部分は必要ないと思いますが、問題ありません/welcome.png

于 2012-06-19T15:04:30.630 に答える