Из Синхронного Сокета В Асинхронный (c#)

Тема в разделе ".NET", создана пользователем nbit, 28 окт 2011.

Статус темы:
Закрыта.
  1. nbit

    nbit Гость

    В MSDN есть замечательный пример получения кода html страницы пример , но к сожалению в этом примере производится блокирование до тех пор, пока не будет принята вся страница. Если не сложно помогите пожалуйста переделать его под асинхронные сокеты, буду премного благодарен за помощь.

    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Сам пример</div></div><div class="sp-body"><div class="sp-content">

    <!--shcode--><pre><code class='csharp'>using System;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;

    public class GetSocket
    {
    private static Socket ConnectSocket(string server, int port)
    {
    Socket s = null;
    IPHostEntry hostEntry = null;

    // Get host related information.
    hostEntry = Dns.GetHostEntry(server);

    // Loop through the AddressList to obtain the supported AddressFamily. This is to avoid
    // an exception that occurs when the host IP Address is not compatible with the address family
    // (typical in the IPv6 case).
    foreach(IPAddress address in hostEntry.AddressList)
    {
    IPEndPoint ipe = new IPEndPoint(address, port);
    Socket tempSocket =
    new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

    tempSocket.Connect(ipe);

    if(tempSocket.Connected)
    {
    s = tempSocket;
    break;
    }
    else
    {
    continue;
    }
    }
    return s;
    }

    // This method requests the home page content for the specified server.
    private static string SocketSendReceive(string server, int port)
    {
    string request = "GET / HTTP/1.1\r\nHost: " + server +
    "\r\nConnection: Close\r\n\r\n";
    Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
    Byte[] bytesReceived = new Byte[256];

    // Create a socket connection with the specified server and port.
    Socket s = ConnectSocket(server, port);

    if (s == null)
    return ("Connection failed");

    // Send request to the server.
    s.Send(bytesSent, bytesSent.Length, 0);

    // Receive the server home page content.
    int bytes = 0;
    string page = "Default HTML page on " + server + ":\r\n";

    // The following will block until te page is transmitted.
    do {
    bytes = s.Receive(bytesReceived, bytesReceived.Length, 0);
    page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes);
    }
    while (bytes > 0);

    return page;
    }

    public static void Main(string[] args)
    {
    string host;
    int port = 80;

    if (args.Length == 0)
    // If no server name is passed as argument to this program,
    // use the current host name as the default.
    host = Dns.GetHostName();
    else
    host = args[0];

    string result = SocketSendReceive(host, port);
    Console.WriteLine(result);
    }
    }[/CODE]
     
  2. CSerX

    CSerX Гость

    Может лучше использовать класс WebRequest, он проще для получения html страниц. а для асинхронных задач можно использовать BackgroundWorker
     
  3. a0z

    a0z Well-Known Member

    Регистрация:
    15 мар 2011
    Сообщения:
    109
    Симпатии:
    0
    Для асинхронности удобно использовать Rx фреймворк (IObservable и иже с ними). Но что бы вникнуть в тему придётся попотеть. В этих IObservable чёрт ногу сломит

    Вот пример, на работоспособность не проверял, таймауты не обрабатываются


    Код (C++):
               
    Action<Stream> processStream = strm => {
    // тут обрабатываем пришедший стрим
    };

    var req = (HttpWebRequest)WebRequest.Create("http://google.com/");
    var process = Observable
    .FromAsyncPattern<WebResponse>(req.BeginGetResponse, req.EndGetResponse)()
    .Subscribe(resp => processStream(resp.GetResponseStream()))
    ;

    // работаем дальше, блокировки нет, результата пока тоже.
    // для отмены скачивания можно вызвать process.Dispose()
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей