Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
hooky-mars
Зарегистрирован: 03.01.2006 Сообщения: 39
|
Добавлено: Сб Мар 08 2008 17:43 Заголовок сообщения: C# Socket`ы, большое количетво запросов.... |
|
|
Saluer!
Пишу клиента, который должен подключаться к большому поличеству серверов... Этот клиет каждую секунду опрашивает все сервера. Причем на каждый сервер может потребоваться разное кол-во запросов. Все вродебы ничего, но с нарастанием количества серверов и запросов к ним, мой клиент неуспеват все делать за секунду.
Сначала использовал блокирующие сокеты
Потом перешол на не блокирующие, но если не использовать задержки, то сервер не пошлет всех ответов. Потому как если сделать вот так:
EventWaitHandle go = new AutoResetEvent(false);
....
client.BeginSend(so.buffer, 0, so.size, SocketFlags.None, new AsyncCallback(SendCallback), so);
go.WaitOne();
....
client.BeginSend(so.buffer, 0, so.size, SocketFlags.None, new AsyncCallback(SendCallback), so);
go.WaitOne();
....
client.BeginSend(so.buffer, 0, so.size, SocketFlags.None, new AsyncCallback(SendCallback), so);
go.WaitOne();
.....
client.BeginSend(so.buffer, 0, so.size, SocketFlags.None, new AsyncCallback(SendCallback), so);
go.WaitOne();
......
void SendCallback(IAsyncResult ar)
{
StateObject so = (StateObject)ar.AsyncState;
Socket s = so.workSocket;
s.EndSend(ar);
go.Set();
}
То все 4 посылки объеденятся в одну! И к серверу отправятся не 4 запроса, а 1!
Что делать? как можно асинхронно, не тормазя основной поток, посылать и обрабатывать пакеты? |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Сб Мар 08 2008 22:54 Заголовок сообщения: |
|
|
А откуда такая необходимость укладываться в секунду? |
|
Вернуться к началу |
|
|
hooky-mars
Зарегистрирован: 03.01.2006 Сообщения: 39
|
Добавлено: Пн Мар 10 2008 11:40 Заголовок сообщения: |
|
|
потомучто моя програ участвует в сиситеме мониторинга....
и сведения критичны.....
время снимается с точностью до милисекунд..... |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пн Мар 10 2008 12:43 Заголовок сообщения: |
|
|
Для того, чтобы все работало именно так, как ты хочешь, тебе надо заняться оптимизацией кода. Если формирование запросов и обработка откликов в сумме занимают больше времени, чем требуется, то варианта только два - либо ужесточать аппаратные требования для твоего ПО, либо менять концепцию реализации. Если у тебя обработанные данные выводятся на экран или записываются в некий лог в реальном времени, то этот процесс можно попробовать запустить отдельной нитью потока, дабы сэкономить на этом время.
Также надо осознавать, что серверы могут быть паралельно заняты своими делами, в результате чего по их вине возникает задержка отклика. Данные, которые тебе необходимы, должны сохраняться на серверах в специальном буфере. Содержимое буфера постоянно обновляется новыми записями пока не отправляется откликом клиенту в ответ на ассинхронный запрос, а сам буфер очищается и начинает заполняться "с нуля" до следующего запроса.
Такая схема не гарантирует актуальности информации на текущий момент времени, но избавляет от "дыр" в данных и является классической моделью клиент-серверного мониторинга.
Главное - понимать, что идеальный алгоритм создать нельзя, так как есть множество факторов, отрицательно влияющих на удержание стабильного соединения ("сетевой шум", загруженность сети) и своевременного отклика (загруженность сервера).
Я на твоем месте решал бы эту задачу не опираясь на необходимость уложиться в определенное время, а нахождением вариантов, при которых временной лимит будет малокритичен. |
|
Вернуться к началу |
|
|
hooky-mars
Зарегистрирован: 03.01.2006 Сообщения: 39
|
Добавлено: Пн Мар 10 2008 13:42 Заголовок сообщения: |
|
|
c серверами я ничего сдалать не моуг, т.к. они для меня как черыный ящик. Я может слишком громко их назвал. Это скорее просто устройства, с которых мне нужно снимать данные. Эти устройства (если они дешовые) могут вообще не поддерживать работу в неблокирующем режиме иметь огрумную задежку на подготовку ответного пакета(порядка250 мс). А кроме того они могут быть от разных производителей....
Короче звиздец.... Пока поришали, как-то устанавливать характеристики устройств и на каждое устройство по потоку. Потому что слишком многое зависит от опрашиваемого устройства..... |
|
Вернуться к началу |
|
|
|