Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];

Вниз

Сокеты. Нет коннекта при определенном условии   Найти похожие ветки 

 
KasAlex   (2003-01-22 15:53) [0]

Здравствуйте! У меня такая проблема: Клиентское приложение (TClientSocket) на рабочей станции вяжется с приложением (TServerSocket) на сервере. Связь модемная, устойчивая. Если сначала установить модемную связь, а затем запустить приложение-клиент, то связь через TClientSocket и TServerSocket устанавливается. (IP,порт настроены, в FormShow делается ClientSocket1.Open). Тут все нормально. А если сначала запустить программу, потом установить модемную связь и пытаться из программы по таймеру делать ClientSocket1.Open, то ничего не происходит! На сервере - никаких событий (OnConnect,OnAccept). Глухо!
Подскажите пожалуйста, почему так происходит и как с этим бороться?


 
mrcat   (2003-01-22 16:01) [1]

KasAlex © (22.01.03 15:53)
...
почему так происходит и как с этим бороться?
...


где код?


 
Kasalex   (2003-01-22 16:30) [2]

Клиент:
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:40) [3]

что, даже никаких сообщений?


 
Digitman   (2003-01-22 16:51) [4]

и это что, весь кл.код ???

а где старт таймера ? к чему он привязан, к какому событию кл.приложения ? и где останов таймера ?

и где обработчик OnError() ?


и вообще - кл.гнездо блокирующее или неблокирующее ?


 
Kasalex   (2003-01-23 10:10) [5]

Нет старта таймера. Ни к чему он не привязан. Нет останова таймера. 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-23 10:38) [6]

>Нет останова таймера

А если коннект случится, что, так "вхолостую" и будет "молотить" таймер ? Выключай его в событии 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 11:26) [7]

ИМХО проблема не в таймере: If Client1.Active Then Exit;
До события OnConnect() дело не доходит! Ошибка 10060 и все тут...


 
Digitman   (2003-01-23 11:58) [8]

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-24 12:08) [9]

Огромное спасибо! Кажется все получилось...


 
Digitman   (2003-01-24 12:13) [10]

Не за фто)

Носи не стаптывай !))



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
4-39624
Sheriff
2003-01-22 15:43
2003.03.13
Посылка сообщению сервису (службе) и наоборот.


3-39210
trans
2003-02-21 17:35
2003.03.13
Зачем проге сетевой диск?


14-39561
race1
2003-02-24 17:09
2003.03.13
сон


4-39632
maxim2
2003-01-23 09:58
2003.03.13
Получить текст меню над которым находится указатель мыши


1-39292
GIL
2003-03-04 04:48
2003.03.13
Динамические массивы и sizeof





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский