![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сокеты. Нет коннекта при определенном условии [D5, Win95/98, NT4]
KasAlex © (2003-01-22 15:53:00)Здравствуйте! У меня такая проблема: Клиентское приложение (TClientSocket) на рабочей станции вяжется с приложением (TServerSocket) на сервере. Связь модемная, устойчивая. Если сначала установить модемную связь, а затем запустить приложение-клиент, то связь через TClientSocket и TServerSocket устанавливается. (IP,порт настроены, в FormShow делается ClientSocket1.Open). Тут все нормально. А если сначала запустить программу, потом установить модемную связь и пытаться из программы по таймеру делать ClientSocket1.Open, то ничего не происходит! На сервере - никаких событий (OnConnect,OnAccept). Глухо!
Подскажите пожалуйста, почему так происходит и как с этим бороться?
Digitman (2003-01-24 12:13:00) [1]Не за фто)
Носи не стаптывай !))
Kasalex (2003-01-24 12:08:00) [2]Огромное спасибо! Кажется все получилось...
Digitman (2003-01-23 11:58:00) [3]procedure TMainFrm.FormShow(Sender: TObject);
begin
Timer1Timer(Sender);
end;
procedure TMainFrm.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
Client1.Open;
end;
procedure TMainFrm.Client1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
Socket.Disconnect(Socket.SocketHandle);
case ErrorCode of
WSAETIMEDOUT, WSAECONNABORTED, WSAECONNRESET:
Timer1.Enabled := True;
else
Memo1.Lines.Insert(0,"Ошибка связи №"+IntToStr(ErrorCode));
end;
ErrorCode:=0;
end;
p.s.
WSAETIMEDOUT = 10060 в этом случае - вполне нормальное явление, ибо время таймаута ожидания коннекта меньше времени на межмодемное соединение ( + еще время на аутентификацию и вход в сеть сервера после установления межмодемного соединения)
Kasalex (2003-01-23 11:26:00) [4]ИМХО проблема не в таймере: If Client1.Active Then Exit;
До события OnConnect() дело не доходит! Ошибка 10060 и все тут...
Digitman (2003-01-23 10:38:00) [5]>Нет останова таймера
А если коннект случится, что, так "вхолостую" и будет "молотить" таймер ? Выключай его в событии OnConnect(). А включай так :
procedure TMainFrm.Client1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
Memo1.Lines.Insert(0,"Ошибка связи №"+IntToStr(ErrorCode));
Socket.Disconnect(Socket.SocketHandle);
case ErrorCode of
WSAETIMEDOUT, WSAECONNABORTED, WSAECONNRESET:
Timer1.Enabled := True;
end;
ErrorCode:=0;
end;
Включай так же в событии OnDisconnect(), если нужно восстановить коннект после разрыва петли по инициативе сервера
Kasalex (2003-01-23 10:10:00) [6]Нет старта таймера. Ни к чему он не привязан. Нет останова таймера. Enabled и все...
Client1.ClientType=ctNonBlocking
Server1.ServerType=ctNonBlocking
Порты одинаковые.
procedure TMainFrm.Client1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
Memo1.Lines.Insert(0,"Ошибка связи №"+IntToStr(ErrorCode));
Try
Client1.Close;
Except End; // Try
ErrorCode:=0;
end;
На сервере никаких событий (сообщений) не возникает.
На клиенте, пока модемная связь не установлена, тоже глухо. А вот когда связь устанавливается, при каждой попытке подключения (по таймеру) на клиенте возникает ошибка №10060. На сервере - ничего... Напомню, что если сначала установить модемную связь, а затем запустить клиентское приложение, то все нормально, происходит коннект, можно работать.
Digitman (2003-01-22 16:51:00) [7]и это что, весь кл.код ???
а где старт таймера ? к чему он привязан, к какому событию кл.приложения ? и где останов таймера ?
и где обработчик OnError() ?
и вообще - кл.гнездо блокирующее или неблокирующее ?
mrcat (2003-01-22 16:40:00) [8]что, даже никаких сообщений?
Kasalex (2003-01-22 16:30:00) [9]Клиент:
procedure TMainFrm.FormShow(Sender: TObject);
begin
Try
Client1.Open;
Except End;
end;
procedure TMainFrm.Timer1Timer(Sender: TObject);
begin
If Client1.Active Then Exit;
Try
Client1.Open;
Except End;
end; // OnTimer(10 second)
Сервер:
procedure TMainFrm.Button1Click(Sender: TObject);
begin
If Server1.Active Then Server1.Close
Else Server1.Open;
end; // Button1Click(Пуск/Стоп)
mrcat (2003-01-22 16:01:00) [10]KasAlex © (22.01.03 15:53)
...
почему так происходит и как с этим бороться?
...
где код?