Вниз
Скачать: CL | DM;

Нужна помощь по сокетам (открытие, закрытие, отправка сообщений)   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.01 c
3-86278
eugie
2003-12-03 10:38
2003.12.26
Можно ли изменить TBookmarkList?


3-86313
Bless
2003-12-01 11:59
2003.12.26
Как наложить блокировку из приложения?


3-86308
Костя
2003-12-02 10:37
2003.12.26
Немогу сделать restore БД - выдаётся ошибка


14-86552
KILLER_ABV
2003-12-02 15:43
2003.12.26
Как перезаписать СD-R.


3-86291
ploxish
2003-12-01 11:23
2003.12.26
Interbase & Generator




   Наверх