2012-06-19 2 views
0

저는 Wi-Fi를 통해 Win-7 랩탑과 삼성 스마트 폰 (Bada OS 2.0) 사이에 ad-hoc 네트워크 연결을 이미 만들었습니다. 또한 IP 주소를 확인하고 노트북에서 내 스마트 폰으로 핑을 연결하여 연결을 확인했습니다.인터넷과 스마트 폰 브라우저 사이의 웹 프록시

필자는 Win-7에있는 프록시 서버를 작성하고 포트 8080에서 스마트 폰의 HTTP 요청을 받아들이고 인터넷에서 웹 페이지를 검색 한 다음 다시 스마트 폰으로 전달합니다. 스마트 폰으로 인터넷에 접속하고 휴대 기기와 관련된 네트워크 프로그래밍을 배우는 아이디어는 두 가지입니다.

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

위의 코드는 클라이언트 (스마트 폰 브라우저에서 요청을 가져옵니다 : 나는 요청을 받아 완벽하게 정상적으로 happenning 된 응답을 다시 보내도록 TCPListener를 구현하는 다음의 C 날카로운 코드를 작성했습니다), 요청 헤더 부분을 가져와이를 웹 서버에 전달하고 응답을 동일한 클라이언트 소켓을 통해 스마트 폰에 다시 전달합니다. 이것은 괜찮습니다. 잘못된 것은 웹 서버가 "잘못된 요청 - 상태 코드 400"의 응답을 보내는 것입니다. 나는 내가하고있는 모든 것이 두 엔드 포인트 사이에서 요청을 앞뒤로 중계하고 있기 때문에 이것이 일어나고 있다는 것에 놀랍니다. 이 점을 좀 나눌 수 있을까요?

요청 :

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> 

답변

1

여기 전송 및 응답 헤더 I 각각 변수 clientmessage 가져오고 strPage하여 가지고 있다고 수신 된 요청 헤더는 편집 : 난 문제가 서버가 될 수 있다고 생각합니다. 대신 Apache를 사용하거나 google.com에 연결하는 것이 어떻습니까?

사이드 노트 : GET 요청에 http://prahlad-tosh 부분이 필요하지 않습니다. 단지 /welcome.png이 좋습니다.

+0

그러나 이것은 스마트 폰 브라우저가 보내는 정확한 헤더입니다. 브라우저가 잘못된 헤더를 보내고 있다고 생각합니까? 브라우저 소프트웨어는 Samsung Dolphin Browser v3.0입니다. –

+0

문제는 아마도 서버 일 수 있으므로 google.com을 요청하십시오. –

+0

www.google.co.in은이 응답을 보내지 만 브라우저 창에는 아무 것도 표시되지 않습니다. HTTP /1.1 200 OK 콘텐츠 유형 : text/html; 문자셋 = UTF-8 콘텐츠 인코딩 : gzip을 전송 - 인코딩 : 청크 날짜 : 2012년 6월 19일 (화) 그리니치 표준시 15시 59분 4초 서버 : GWS 캐시 제어 : 개인 X-XSS-보호 : 1; 모드 = 블록 X 프레임 옵션 : SAMEORIGIN 2d56 ? –

관련 문제