Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таймаут в TClientSocket, Как установить Таймаут соединения? 
:(
    Опции темы
Maestro
Дата 14.12.2005, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 7.9.2005

Репутация: нет
Всего: нет



Как установить Таймаут соединения меньше?

Код

  socet:= TClientSocket.Create(nil);

  socet.Address:= '10.10.10.1';
  socet.Port:= 21;
  try
  Socet.OnConnect:= Form1.SocketConnect;
  Socet.OnError:= Form1.SocketError;
  Socet.Active := true;
  except
  Socet.Active := false;
  Socet.Free;
  end;

Ожидание больше 5-ти сек.
PM MAIL   Вверх
Romikgy
Дата 15.12.2005, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Т.е. если более 5 сек не ответили или если более 5 сек нет никакой активности/ передачи/приема???? Таймаут на что?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 15.12.2005, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Вероятно таймаут в случае, если хост не отвечает.
PM MAIL   Вверх
Демо
Дата 16.12.2005, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 3
Всего: 50



Можно извратиться, и убить соединение из потока.

Вот пример. Тщательно не проектировал. Просто пример.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp,WinSock;

type
  TTerminator=class(TThread)
  private
    FCS: TClientSocket;
    FTimeOut: Integer;
  protected
    procedure Execute; override;
  public
    constructor Create(aSocket: TClientSocket;aTimeOut: Integer);
  end;

  TForm1 = class(TForm)
    CS: TClientSocket;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure CSError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure CSConnect(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  CS.Port := 80;
  CS.Host := 'forum.ru-board.com';
  TTerminator.Create(CS,1500);
  CS.Open;
end;

{ TTerminator }

constructor TTerminator.Create(aSocket: TClientSocket; aTimeOut: Integer);
begin
  inherited Create(True);
  FreeOnTerminate := True;
  FCS := aSocket;
  FTImeOut := aTimeOut;
  Resume;
end;

procedure TTerminator.Execute;
begin
  Sleep(FTimeOut);
  if not FCS.Active then CloseSocket(FCS.Socket.SocketHandle);
end;

procedure TForm1.CSError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  if ErrorCode = 10038 then
  begin
    ShowMessage('Connect timeout');
    ErrorCode := 0;
  end;
end;

procedure TForm1.CSConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  ShowMessage('Connect');
  CS.Socket.Close;
end;

end.




--------------------
    
PM MAIL ICQ Skype   Вверх
wsr
Дата 17.1.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fuzzy Logic
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 3.7.2005

Репутация: нет
Всего: 2



Разъясняю суть темы:
Открывается сокетное соединение -> Посылается запрос -> Принимается ответ -> Проходит некоторое время X и сокет закрывается.
Как изменять это время X

--------------------
 ICQ : 918-318Сайт : Lock-Team 
PM MAIL WWW ICQ   Вверх
Snowy
Дата 17.1.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Используй неблокирующий сокет.
Код

var
  TimeOut: integer;
begin
  // ..... создаем сокет, присваиваем параметры
  Socket.ClientType := ctNonBlocking;
  Socket.Active := True;
  //иммитация блокирующего режима
  for TimeOut := 1 to 20 do // 20 по 100 ms = 2 секунды
    if (Socket.Active <> True) then
    begin
      Sleep(100);
      Application.ProcessMessages;
    end;
  if Socket.Active := True then // ура, есть контакт
  else // не удалось соедениться
  // ....... Дальше убиваем сокет, 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0495 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.