![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 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, корректно получаю имя сервера, пытаюсь таким же способом отправить сообщение и... натыкаюсь опять на тот же камень. Итог: в случае одиночной отправки сообщения одному серверу или последовательности сообщений одному серверу все работает корректно. При попытке рассылки одного сообщения, я получаю ... Короче, ничего не получаю. Есть у кого-нибудь какие-нибудь идеи? |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
![]()
Да, есть, Indy с встроенным механизмом распределения потоков.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
![]() |
![]() |
![]() |
#3 |
Регистрация: 28.08.2007
Сообщений: 3
|
![]()
Не спорю. Но как можно решить это используя ClientSocket?
Честно говоря, слишком много придется переписывать. |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
![]()
Соответственно каким-то образом "ждать" пока сокет разблокируется.
Точно сейчас сказать не могу, но уверен что можно в MSDN найти проверку на занятость сокета
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
![]() |
![]() |
![]() |
#5 |
Регистрация: 28.08.2007
Сообщений: 3
|
![]()
Хм... То есть причина в том, что соект не успевает открыться/закрыться? Я пробовал ставить Sleep(100) и даже проверку:
if (ClientSocket1.Active) then ClientSocket1.Active:=false; Но Это также ни к чему не привело... ![]() |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
![]()
как я понимаю проблема собственно в блокирующих сокетах, т.е. пока один сокет не получит результат и не закончит свою работу, далее он ничего делать не может
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как работатет сервис по поиску игровых серверов | 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 |