Форум: "Сети";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
ВнизНужна помощь по сокетам (открытие, закрытие, отправка сообщений) Найти похожие ветки
← →
AlexV (2003-10-29 08:39) [0]Hi, All!
В статьях данного сайта не смог найти ответ на свой вопрос.
Мне известен список IP адресов локальной сети(массив IP), на которые нужно
разослать некоторую текстовую строку "ABC". Если на той машине
запущена программа с ServerSocket, то она примет мое сообщение и
ответит мне, а я приму ответ и помечу у себя, что "ответ пришел" (user online), если не пришел, то (user offline).
Делаю так:
For i:=0 to 9 do
begin
if ClientSocket1.Active then ClientSocket1.Close;
ClientSocket1.Host:=IP[i]; // берем очередной адрес IP из массива известных мне IP адресов локалки
ClientSocket1.Port:=1010;
ClientSocket1.open; // открываем сокет
ClientSocket1.Socket.SendText("ABC"); // отправляем сообщение
ClientSocket1.close; // закрываем сокет
end;
Но это не работает, т.к. ClientSocket1.open; не переведет сокет в
Active=True(а переведет только после всех операторов программы) и ClientSocket1.Socket.SendText("ABC") не выполнится :-(
1) Как сделать, чтобы open сработало моментально, до того, как будут выполняться следующие операторы ?
2) Можно ли ловить ошибки прямо здесь, а не в обработчиках OnConnect, OnError ?
Заранее благодарен, AlexV
← →
Digitman (2003-10-29 09:32) [1]
> 1) Как сделать, чтобы open сработало моментально, до того,
> как будут выполняться следующие операторы ?
>
> 2) Можно ли ловить ошибки прямо здесь, а не в обработчиках
> OnConnect, OnError ?
перед первым открытием кл.гнезда (до входа в цикл) установи св-во
ClientSocket1.ClientType := ctBlocking;
тогда
with ClientSocket1 do
begin
if Active then Close;
ClientType := ctBlocking;
For i:=0 to 9 do
begin
Address :=IP[i];
Port:= 1010;
try
Open;
try
Socket.SendText("ABC");
finally
Close;
end;
except
on e: Exception do
ShowMessage(e.message);
end;
end;
при этом "моментально" или не "моментально" выполнится Open - зависит от конкретных сетевых условий
← →
AlexV (2003-10-29 10:14) [2]Спасибо Digitman :-)
Может еще знаешь, как зная имя машины, получить его IP с помощью этого же компонента TClientSocket (или TServerSocket) ?
Если это невозможно, то как проще всего ?
← →
AlexV (2003-10-29 10:18) [3]А вот уже нашел :-)
ClientSocket1.Socket.LocalAddress
Вопрос еще:
Как установить TimeOut на посылку сообщений через ClientSocket1 или на .open ?
← →
Digitman (2003-10-29 10:29) [4]
> ClientSocket1.Socket.LocalAddress
это из другой оперы
> Как установить TimeOut на посылку сообщений через ClientSocket1
> или на .open ?
о каком тайм-ауте речь ведешь ? что под сим подразумевается ?
← →
AlexV (2003-10-29 10:40) [5]т.е. хочу, чтобы .open делалось не 5 секунд, а всего одну.
Считать, что если за секунду соединения не произошло, то тот комп выключен или прога SocketServer у него не запущена или такого компа в локалке вообще нет.
А то если список IP большой, то для его проверки нужно будет много времени.
← →
Digitman (2003-10-29 11:05) [6]
> т.е. хочу, чтобы .open делалось не 5 секунд, а всего одну
многого хочешь) ... еще раз повторяю - время работы механизма установления коннекта зависит от многих факторов, в 1-ю очередь - от сетевой конфигурации
> Считать, что если за секунду соединения не произошло, то
> тот комп выключен или прога SocketServer у него не запущена
> или такого компа в локалке вообще нет.
неверно так считать.
хост может присутствовать, и серверная часть на нем активна, но процедура коннекта по вышеуказанным причинам может занимать заранее неизвестное время
> если список IP большой, то для его проверки нужно будет
> много времени.
организуй проверки в доп.код.потоках, пусть попытки коннектов сразу к нескольким хостам будут осуществляться параллельно
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c