2011-11-01 24 views
2

早上好 我C#程序員,我有一個問題CONNECT HTTP方法

我試圖打開插座得到一個HTTP連接,並讀取網頁的字節 流和所有是正確的, 例如,通過一個C#的Socket得到谷歌的主頁, 我遵循的步驟是:

1.Opening流,並連接到Google服務器:

Socket skt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
skt.Connect("www.google.com", 80); 

2.preparing請求,並把它以字節數組:

string hdrs = "GET/HTTP/1.1\r\n" 
    + "Host: www.google.com\r\n\r\n"; 
byte[] req_as_bytes = Encoding.UTF8.GetBytes(hdrs); 

3.Sending HTTP請求:

skt.Send(req_as_bytes); 

4.Receiving響應:

byte[] data = new byte[1024 * 200]; // 200 kilo bytes 
int t = skt.Receive(data); 
Console.WriteLine(Encoding.UTF8.GetString(data,0,t)); 

但是當我改變http方法從[GET]到[CONNECT], 的迴應將是空的!

string hdrs = "CONNECT www.google.com:443 HTTP/1.1\r\n" 
    + "Host: www.google.com:443\r\n" 
    + "Proxy-Connection: keep-alive\r\n\r\n"; 

任何一個可以幫助我:或無數據從服務器 新的請求被接收?

的完整代碼:

static void Main(string[] args) 
{ 
    Socket skt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    skt.Connect("www.google.com", 443); 
    string hdrs = "CONNECT www.google.com:443 HTTP/1.1\r\n" 
     + "Host: www.google.com:443\r\n" 
     + "Proxy-Connection: keep-alive\r\n\r\n"; 
    byte[] req_as_bytes = Encoding.UTF8.GetBytes(hdrs); 
    skt.Send(req_as_bytes); 
    byte[] data = new byte[1024 * 200]; // 200 kilo bytes 
    int t = skt.Receive(data); 
    Trace.WriteLine(Encoding.UTF8.GetString(data, 0, t); 
    skt.Shutdown(SocketShutdown.Both); 
    skt.Close(); 
} 

謝謝... Mhamad

+0

你知道'CONNECT'的作用嗎?你知道下一步該做什麼或期待嗎?當您嘗試學習套接字時,HTTP並不是最容易學習的協議。 – CodeCaster

+0

你期望'CONNECT'會做什麼?您爲什麼認爲它適用於google.com? – svick

+0

它適用於任何網站支持https, – MhdAboAhmad

回答

2

如果你真的想實現一個HTTPS服務器,你需要閱讀RFC

順便說一句,它已經在.NET中實現:System.Net.HttpListener

+0

謝謝, ,但我仍然需要使用一個簡單的套接字 – MhdAboAhmad

+4

'套接字'實現TCP是一種傳輸層協議。 HTTP/HTTPS是位於TCP之上的應用層協議。如果你想使用'Socket',你將不得不從RFC實現HTTP/HTTPS。這並不容易 - 祝你好運! –

0
socket.Connect("www.google.com", **80**); 

string hdrs = "CONNECT www.google.com:**443** HTTP/1.1\r\n" 
    + "Host: www.google.com:443\r\n" 
    + "Proxy-Connection: keep-alive\r\n\r\n"; 

80 - 443衝突!

如果您使用443端口?必須使用.NET 4.0 FRAMEWORK-SSLSTREAM類。