Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

C# Socket`ы, большое количетво запросов....

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 мс). А кроме того они могут быть от разных производителей....
Короче звиздец.... Пока поришали, как-то устанавливать характеристики устройств и на каждое устройство по потоку. Потому что слишком многое зависит от опрашиваемого устройства.....
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...