HTTP через C # сокеты - PullRequest
       30

HTTP через C # сокеты

4 голосов
/ 18 октября 2011

Я пытаюсь отправить HTTP-запрос и получить ответ от сервера через сокеты C #, и я новичок в этом языке.

Я написал следующий код (IP-адрес разрешен правильно):

IPEndPoint RHost = new IPEndPoint(IP, Port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(RHost);

String HTTPRequestHeaders_String = "GET ?q=fdgdfg HTTP/1.0
Host: google.com
Keep-Alive: 300
Connection: Keep-Alive
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16
Referer: http://google.com/";

MessageBox.Show(HTTPRequestHeaders_String, "Request");

byte[] HTTPRequestHeaders = System.Text.Encoding.ASCII.GetBytes(HTTPRequestHeaders_String);
socket.Send(HTTPRequestHeaders, SocketFlags.None);

String Response = "";
byte[] buffer = new byte[(int) socket.ReceiveBufferSize];

int bytes;
do
{
    // On this lane program stops to react
    bytes = socket.Receive(buffer);
    // This line cannot be reached, tested with breakpoint
    Response += Encoding.ASCII.GetString(buffer, 0, bytes);
}
while (bytes >= 0);

MessageBox.Show(Response, "Response");

Что я делаю не так?Мне нужно просто загрузить полный HTML-код страницы или хотя бы несколько символов из ответа (я не могу даже этого сделать).

Ответы [ 4 ]

6 голосов
/ 18 октября 2011

Я бы посоветовал заглянуть в сам протокол, если вы хотите сделать это необработанным, http://www.w3.org/Protocols/HTTP/1.0/spec.html#Request

И попробуйте отправить CRLF для завершения запроса;)

1 голос
/ 28 февраля 2013

Я обнаружил, что Mentalis Proxy чрезвычайно полезен для понимания цикла запросов / ответов Http на уровне сокетов: http://www.mentalis.org/soft/projects/proxy/

1 голос
/ 18 октября 2011
var webClient = new WebClient();
webClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
Stream responseStream = webClient.OpenRead("http://www.google.com");
if (responseStream != null)
{
   var responseReader = new StreamReader(responseStream);
   string response = responseReader.ReadToEnd();
   MessageBox.Show(response);
}
0 голосов
/ 18 октября 2011

Существует класс TcpClient, который, с одной стороны, позволяет вам полностью контролировать запрос (вы создаете тело запроса в виде строки), а с другой стороны, использовать его намного проще, чем сокет низкого уровня.

http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx

...