I am trying to write a "raw" HTTP client in C#. You may ask why??
My aim is to implement an HTTP client in J2ME (which can only do GET and limited POST), but first I need to understand the HTTP protocol better (hence the C# attempt).
My first attempts are failing:
var requestBytes = Encoding.UTF8.GetBytes(@"GET / HTTP/1.1
User-Agent: CSharp
Host: www.google.com
");
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("www.google.com", 80);
socket.Send(requestBytes);
var responseBytes = new byte[socket.ReceiveBufferSize];
socket.Receive(responseBytes);
Console.Out.Write(Encoding.UTF8.GetString(responseBytes));
The socket opens, but then blocks at the Receive call. After a couple of seconds the remote host closes the connection.
Any ideas?
The same happens when I try to connect using the RAW mode in puTTY.
If you're going to be playing down at the "raw" level, then you're responsible for understanding the protocols down there. See Hypertext Transfer Protocol -- HTTP/1.1 .
Otherwise, you should just stick to the WebRequest and WebClient classes.
It might be best if you're testing this thing, to install IIS or Apache locally and then use the address 127.0.0.1; it gives you more scope to test different things!
Being a bit of a prude, I wouldn't like it if somebody used my website to test their implementation of the HTTP protocol.
I think you need to use TcpListener class.
Then
Hope it will help.