Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2007, 17:05   #1
Maxxon
 
Регистрация: 28.08.2007
Сообщений: 3
Злость Проблемы с одним клиентом и множеством серверов

Здравствуйте!
Долго бьюсь над решением проблемы, но никак не удается довести до ума.

Немного сути:
Есть один клиент и пара десятков серверов. Соответственно, используются ClientSocket и ServerSocket. Клиент отсылает конкретному серверу сообщение, получает ответ и делает некие действия. В клиенте использован компонент TreeView для выбора нужного сервера, на событие OnClick повешена отправка базового сообщения, остальные сообщения отправляются путем выбора других элементов (низлежащие ноды, кнопки в другой панели и др.). При срабатывании OnClick в глобальную переменную server_name пишется выбранное значение.
Теперь задача:
Имея список этих серверов в массиве, отослать каждому из них сообщение, получить ответ, обработать сумму этих ответов и получить результат.

Задача вполне тривиальна, но я наткнулся на подводный камень и не могу с него слезть.
Когда я устанавливаю переменную server_name, сообщение отсылаю так:
ClientSocket1.Host:=selected_server ;
ClientSocket1.Port:=5555;
ClientSocket1.Active:=true;
ClientSocket1.Socket.SendText('my_t ext');
//(свойство Active по умолчанию в false)
Все работает, все замечательно. Но когда я делаю цикл:
for s:=0 to servers_index-1 do
begin
s_name:=servers_list[s];
ClientSocket1.Host:=s_name;
ClientSocket1.Port:=5555;
ClientSocket1.Active:=true;
ClientSocket1.Socket.SendText('my_t ext');

end;

я получаю ошибку типа "Невозможно сменить имя сервера пока сокет открыт". Ладно... Я закрываю сокет перед этим:

for s:=0 to servers_index-1 do
begin
s_name:=servers_list[s];
ClientSocket1.Active:=false;
ClientSocket1.Host:=s_name;
ClientSocket1.Port:=5555;
ClientSocket1.Active:=true;
ClientSocket1.Socket.SendText('my_t ext');

end;

и... вижу, что вместо сообщения my_text на сервер летит пустое сообщение.

Вот такой вот глюк...

Самое интересное: вместо этого цикла я написал обход верхних нод в TreeView, корректно получаю имя сервера, пытаюсь таким же способом отправить сообщение и... натыкаюсь опять на тот же камень.

Итог: в случае одиночной отправки сообщения одному серверу или последовательности сообщений одному серверу все работает корректно. При попытке рассылки одного сообщения, я получаю ... Короче, ничего не получаю.

Есть у кого-нибудь какие-нибудь идеи?
Maxxon вне форума Ответить с цитированием
Старый 28.08.2007, 17:09   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Да, есть, Indy с встроенным механизмом распределения потоков.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 28.08.2007, 17:11   #3
Maxxon
 
Регистрация: 28.08.2007
Сообщений: 3
По умолчанию

Не спорю. Но как можно решить это используя ClientSocket?
Честно говоря, слишком много придется переписывать.
Maxxon вне форума Ответить с цитированием
Старый 28.08.2007, 17:15   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Соответственно каким-то образом "ждать" пока сокет разблокируется.
Точно сейчас сказать не могу, но уверен что можно в MSDN найти проверку на занятость сокета
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 28.08.2007, 17:25   #5
Maxxon
 
Регистрация: 28.08.2007
Сообщений: 3
По умолчанию

Хм... То есть причина в том, что соект не успевает открыться/закрыться? Я пробовал ставить Sleep(100) и даже проверку:
if (ClientSocket1.Active) then ClientSocket1.Active:=false;
Но Это также ни к чему не привело...
Maxxon вне форума Ответить с цитированием
Старый 28.08.2007, 17:27   #6
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

как я понимаю проблема собственно в блокирующих сокетах, т.е. пока один сокет не получит результат и не закончит свою работу, далее он ничего делать не может
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работатет сервис по поиску игровых серверов gamer2008 PHP 1 19.08.2008 23:59
BETWEEN и LIKE одним запросом Pinya SQL, базы данных 9 19.08.2008 11:30
Вход под одним пользователем Mihael Безопасность, Шифрование 3 21.11.2007 12:14
обмен сообщениями между клиентом и сервером используя ClientSocket и ServerSocket xTANATOSx Работа с сетью в Delphi 3 04.10.2007 15:17
Изменение инициативы при перекрывании одним изображением другого itisiam Общие вопросы Delphi 4 11.05.2007 23:33