Проблема вот в чем: Нужно циклически получать данные от whois-сервера (для зоны РУ это whois.ripn.ru, насколько я знаю. Как я понял остальные все работают через него) но с большой скоростью, и постоянно. У него блок стоит на 30 запросов в минуту. У меня в распоряжении 10 разных IPшников. Какую максимальную производительность можно выжать и как лучше? Пишу на C# Спасибо.
Я думаю, что используя многопоточность (не обязательно) при данном раскладе, тебе удастся выжать максимум 300 запросов в минуту.
а насчет других серверов? они все работают через whois.ripn.ru ? Это я к тому, что если слать запросы не только на сам whois.ripn.ru, но и на сайты, которые им пользуются?
я имею ввиду не быстрее работают, а дают дополнительные источники. т.е. ели обращаться сразу к нескольким? например, 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?
врядли они отсылают ай-пи запросившего на рипе. Так что считай это дополнительными возможностями до доказательств опытным путем обратного.
Начал писать приложение на асинхронных сокетах. Столкнулся с проблемой, вот код (имеется 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(ipAddress, 80); Socket[] socks = new Socket[10]; IPEndPoint[] localEPs = new IPEndPoint[10]; for(int i=0; i<10; i++) socks[i] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); for(int i=0; i<10; i++) localEPs[i] = new IPEndPoint(IPAddress.Parse(IPs.GetValue(i).ToString()), 0); for (int i = 0; i < 10; i++) socks[i].Bind(localEPs[i]); for (int i = 0; i < 10; i++) { 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.buffer, 0, StateObject.BufferSize, 0, 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.buffer, 0, bytesRead)); client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 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 client, String data) { byte[] byteData = Encoding.ASCII.GetBytes(data); client.BeginSend(byteData, 0, byteData.Length, 0, 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)