Whois сервис

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by kurz, 13 Sep 2010.

  1. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    Проблема вот в чем:
    Нужно циклически получать данные от whois-сервера (для зоны РУ это whois.ripn.ru, насколько я знаю. Как я понял остальные все работают через него) но с большой скоростью, и постоянно. У него блок стоит на 30 запросов в минуту. У меня в распоряжении 10 разных IPшников. Какую максимальную производительность можно выжать и как лучше? Пишу на C#
    Спасибо.
     
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Я думаю, что используя многопоточность (не обязательно) при данном раскладе, тебе удастся выжать максимум 300 запросов в минуту.
     
  3. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    а насчет других серверов? они все работают через whois.ripn.ru ?
    Это я к тому, что если слать запросы не только на сам whois.ripn.ru, но и на сайты, которые им пользуются?
     
    #3 kurz, 13 Sep 2010
    Last edited: 13 Sep 2010
  4. NemeZz

    NemeZz Elder - Старейшина

    Joined:
    20 Aug 2008
    Messages:
    102
    Likes Received:
    67
    Reputations:
    3
    приведи хоть какие-то другие сервера, которые работают быстрее?
     
  5. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Везде разные лимиты.
     
  6. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    я имею ввиду не быстрее работают, а дают дополнительные источники. т.е. ели обращаться сразу к нескольким? например, http://whois.regtime.net/scripts/whois.pl?domain_name=test.ru или http://whois.wm-help.net/whois.php?domain=yandex.ru, если будет те самые 300 запросов в минуту на каждом, то это уже лучше.
    но они сами получают информацию из RIPN.net (все помоему), это для них как первоисточник. не будут ли рассматриваться эти запросы к разным сайтам, как один поток запросов с моего IP к RIPN.net?
     
  7. NemeZz

    NemeZz Elder - Старейшина

    Joined:
    20 Aug 2008
    Messages:
    102
    Likes Received:
    67
    Reputations:
    3
    врядли они отсылают ай-пи запросившего на рипе. Так что считай это дополнительными возможностями до доказательств опытным путем обратного.
     
  8. wwiiss5

    wwiiss5 Elder - Старейшина

    Joined:
    13 Oct 2013
    Messages:
    55
    Likes Received:
    14
    Reputations:
    11
    будем-с выяснять )
     
  9. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    Начал писать приложение на асинхронных сокетах. Столкнулся с проблемой, вот код (имеется 10 разных IPшников):
    PHP:
    private static string response String.Empty;
    private static 
    ManualResetEvent connectDone =
            new 
    ManualResetEvent(false);
        private static 
    ManualResetEvent sendDone =
            new 
    ManualResetEvent(false);
        private static 
    ManualResetEvent receiveDone =
            new 
    ManualResetEvent(false);
    IPHostEntry ipHostInfo Dns.Resolve("www.host.net");
            
    IPAddress ipAddress ipHostInfo.AddressList[0];
            
    IPEndPoint remoteEP = new IPEndPoint(ipAddress80);
            
    Socket[] socks = new Socket[10];
            
    IPEndPoint[] localEPs = new IPEndPoint[10];

            for(
    int i=0i<10i++)
                
    socks[i] = new Socket(AddressFamily.InterNetwork,
                
    SocketType.StreamProtocolType.Tcp);

            for(
    int i=0i<10i++)
                
    localEPs[i] = new IPEndPoint(IPAddress.Parse(IPs.GetValue(i).ToString()), 0);

            for (
    int i 010i++)
                
    socks[i].Bind(localEPs[i]);

            for (
    int i 010i++)
            {
                
    socks[i].BeginConnect(remoteEP,
                    new 
    AsyncCallback(ConnectCallback), socks[i]);
                
    connectDone.WaitOne();
            }

            
    int current 0;
            while (
    reader.Read())
            {
                
    string data "данные POST";
                
    string request =
                
    "POST / HTTP/1.1\r\n" +
                
    "Host: www.host.net\r\n" +
                
    "Referer: http://www.host.net\r\n" +
                
    "Connection: Keep-Alive\r\n" +
                
    "Content-Type: application/x-www-form-urlencoded\r\n" +
                
    "Content-Length: " data.Length.ToString() + "\r\n\r\n" data;

                
    Send(socks[current], request);
                
    sendDone.WaitOne();

                
    Receive(socks[current]);
                
    receiveDone.WaitOne();

                
    Console.WriteLine(response);

                
    current++;
                if (
    current == 10)
                    
    current 0;

                
    Thread.Sleep(300);
            }
    + функции как в MSDN
    PHP:
    public class StateObject
    {
        
    // Client socket.
        
    public Socket workSocket null;
        
    // Size of receive buffer.
        
    public const int BufferSize 256;
        
    // Receive buffer.
        
    public byte[] buffer = new byte[BufferSize];
        
    // Received data string.
        
    public StringBuilder sb = new StringBuilder();
    }

    private static 
    void ConnectCallback(IAsyncResult ar)
        {
            try
            {
                
    Socket client = (Socket)ar.AsyncState;
                
    client.EndConnect(ar);
                
    connectDone.Set();
            }
            catch (
    Exception e)
            {
                
    Console.WriteLine(e.ToString());
            }
        }

    private static 
    void Receive(Socket client)
        {
            try
            {
                
    StateObject state = new StateObject();
                
    state.workSocket client;
                
    client.BeginReceive(state.buffer0StateObject.BufferSize0,
                    new 
    AsyncCallback(ReceiveCallback), state);
            }
            catch (
    Exception e)
            {
                
    Console.WriteLine(e.ToString());
            }
        }

        private static 
    void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                
    StateObject state = (StateObject)ar.AsyncState;
                
    Socket client state.workSocket;

                
    int bytesRead client.EndReceive(ar);
                if (
    bytesRead 0)
                {
                    
    state.sb.Append(Encoding.ASCII.GetString(state.buffer0bytesRead));
                    
    client.BeginReceive(state.buffer0StateObject.BufferSize0,
                        new 
    AsyncCallback(ReceiveCallback), state);
                }
                else
                {
                    if (
    state.sb.Length 1)
                        
    response state.sb.ToString();
                    
    receiveDone.Set();
                }
            }
            catch (
    Exception e)
            {
                
    Console.WriteLine(e.ToString());
            }
        }

        private static 
    void Send(Socket clientString data)
        {
            
    byte[] byteData Encoding.ASCII.GetBytes(data);
            
    client.BeginSend(byteData0byteData.Length0,
                new 
    AsyncCallback(SendCallback), client);
        }

        private static 
    void SendCallback(IAsyncResult ar)
        {
            try
            {
                
    Socket client = (Socket)ar.AsyncState;
                
    client.EndSend(ar);
                
    sendDone.Set();
            }
            catch (
    Exception e)
            {
                
    Console.WriteLine(e.ToString());
            }
        }
    Суть в чем: после выполнения 10ти шагов цикла (успешно) он зацикливается на одном и том же выводе и чуть позже дает:
    Code:
    Unhandled Exception: System.Net.Sockets.SocketException: An established connecti
    on was aborted by the software in your host machine
       at System.Net.Sockets.Socket.BeginSend(Byte[] buffer, Int32 offset, Int32 siz
    e, SocketFlags socketFlags, AsyncCallback callback, Object state)
       at AsynchronousClient.Send(Socket client, String data)
       at AsynchronousClient.Main(String[] args)
    
     
    #9 kurz, 17 Sep 2010
    Last edited: 17 Sep 2010