![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Опять же сокеты
Timon © (2002-02-15 18:58:00)Вобщем, проблема в следующем. Есть сокет-клиент далее называемый Client. Он должен соединится с сервером, то-есть ждать появления сервера. Для этого сделано так
procedureTmainf.clientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
ifErrorEvent=eeСonnect then
begin
client.Open;
ErrorCode:=0;
end;
end;
Впринципе все неплохо работает, если сервер еще не появлялся. Но если сервер появился а потом был закрыт, то соединение не востанавливается. И это не смотря на то что при событии onDisconnect client.active устанавливается в true.
Всем зарание огромный thanks.
Timon (2002-04-08 17:15:00) [1]Ghost, мда хитро. Но все оказалось проще. Оказывается делфя сначала открывает отдельный поток на сокет, а уже потом, в случае удачного открытия ассоциирует его с пользовательским сокетом. А если не удачно, то закрыть этот поток нужно программно.
Исправленный код выглядит так
procedureTmainf.clientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; varErrorCode: Integer);
begin
ifErrorEvent=eeСonnect then
begin
Socket.Close;
client.Open;
ErrorCode:=0;
end;
end;
Ghost. (2002-03-14 17:08:00) [2]Тада подругому..я сделал, что сервер рассылает широовещательные сообщения(вместе со служебной информацией) по всей сети, а в клиентах наооборот UDP серверы стоят, ак тока клиент такое сообщение поймал и соотверственно получил адрес сетвера вот тогда уже через другой соет осуществляет TCP соединения, а предыдущий сокет если ненадо можно закрыть, а можно и использовать..зависит от назначения проги..кстати не громоздко но очень удобно получается...где сервер не запустишь..клиенты его сразу находят
Timon (2002-03-14 15:28:00) [3]Ghost
Так ты это для сервера написал. А что если клиент у клиента active стоит на false. В таком случае сервер его и не видит.
Я то и спрашиваю, как в таком случае клиенту active на true поставить?
Ghost. (2002-02-18 13:09:00) [4]Я просто не знаю как этот компонент устроен, но думаю, что если написать в начале процедуры чтонить типа
if ErrorEvent<>eeСonnect then exit;
то не может он много потоков открыть
вот так у меня написанно и причем еще ниодной ошибки небыло
if WSocketServer1.ClientCount>0 then exit;
WSocketServer1.close;
WSocketServer1.Port:="3334";
WSocketServer1.Addr:="0.0.0.0";
WSocketServer1.Listen;
Timon (2002-02-18 12:59:00) [5]Ghost, я уже ставил на таймер. Получается вообще лажа. Он открывает столько потоков, что в конце концов виснет к чертовой матери.
Ghost. (2002-02-16 09:11:00) [6]Поставь процедуру на таймер...тогдаи не ошибешься..у меня именно так работает и клиенты всегда четко дожидаются