Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2012, 16:27   #1
Letnab
Пользователь
 
Регистрация: 16.12.2009
Сообщений: 52
Восклицание Слушать udp порт

Доброе время суток форумчане!
Не могу сообразить как реализовать прослушку UDP порта. Использую компонент UDPServer. помогите с кодом.
Letnab вне форума Ответить с цитированием
Старый 25.05.2012, 16:30   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Слушать может только клиент.
UDPClient + TThread.

А чо кодом, а не готовой программой? Где ваши наработки?
Человек_Борща вне форума Ответить с цитированием
Старый 25.05.2012, 16:33   #3
Letnab
Пользователь
 
Регистрация: 16.12.2009
Сообщений: 52
По умолчанию

Оо! не знал. я с этим первый раз сталкиваюсь.
примером не поможете?
Letnab вне форума Ответить с цитированием
Старый 25.05.2012, 16:37   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Разбирайтесь.
Код:
unit ServerPingThread;

interface

uses
  IdSocketHandle,
  IdUDPServer,
  sysUtils,
  Classes,
  Windows;

type
  TlolThread = class(TThread)
  private
    fResult: Boolean;
    fTimeout: Integer;
    fMaxAttempts: Integer;
    fIP: string;
    fPort: Integer;
    fEvent: THandle;
    fOnTimeOut: TOnTimeout;
    fWaitStart: Integer;
    procedure SetProc(aVal: TOnTimeout);
  protected
    procedure Execute; override;
  public
    UDP: TIdUDPServer;
    property IP: string read fIP write fIP;
    property Port: Integer read fPort write fPort;
    property WaitStartSec: Integer read fWaitStart write fWaitStart;
    procedure UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    constructor Create; virtual;
    destructor Destroy; override;
  end;

implementation

uses
  MainDMUnit, HLRTypes;

procedure TlolThread.UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  Buff: array [0 .. 255] of Char;
  s: string;
begin
  AData.Read(Buff, Length(Buff));
  s := StrPas(Buff);
  if (s = Server_Answer) then // если ответ сервера правельный.
  begin
    Result := True;
    SetEvent(fEvent); // Сигнальное состояние
  end
  else
    Result := False;
end;

{ TPingThread }


procedure TlolThread.Execute;
var
  Data: array of Char;
  Attemptcount: Integer;
begin
  if fWaitStart > 0 then
  begin
    Sleep(fWaitStart * 1000); // ; ждём запуска MainThread
  end;
  SetLength(Data, Length(Server_Request));
  StrPCopy(@Data[0], Server_Request);
  Attemptcount := 0;

  while not terminated do
  begin
    if terminated then
      Exit;
    Sleep(1000);
    try
      // UDP.SendBuffer(fIP, fPort, Data[0], Length(Data));
    except
      On E: Exception do
      begin
        Log.AddItem('Ошибка отправки запроса на сервер: ' + fIP + ':' +
          IntToStr(fPort) + #10#13 + E.ClassName + ' ' + E.Message, laError);
        Break; // Пропустим эту интерацию цикла.
      end;
    end;
    if WaitForSingleObject(fEvent, fTimeout * 1000) = WAIT_TIMEOUT then
    begin
      if (Attemptcount < fMaxAttempts) then
        Inc(Attemptcount);

      if terminated then
        Exit;

      if (Attemptcount = fMaxAttempts) then
      begin
        Terminate;
        Synchronize(fOnTimeOut);
      end;

      ResetEvent(fEvent); // НЕ сигнальное состояние
    end;
  end;
end;

constructor TPingThread.Create;
begin
  inherited Create(True);
  FreeOnTerminate := True;
  fEvent := CreateEvent(nil, True, False, nil);
  UDP := TIdUDPServer.Create(nil);
  UDP.ThreadedEvent := True;
  UDP.OnUDPRead := UDPRead;
end;

destructor TPingThread.Destroy;
begin
  FreeAndNil(UDP);
  CloseHandle(fEvent);
  inherited;
end;

end.
Удачи.

Последний раз редактировалось Человек_Борща; 25.05.2012 в 16:39.
Человек_Борща вне форума Ответить с цитированием
Старый 25.05.2012, 16:39   #5
Letnab
Пользователь
 
Регистрация: 16.12.2009
Сообщений: 52
По умолчанию

Спасибо большое за код. Буду ковыряться!
Letnab вне форума Ответить с цитированием
Старый 26.05.2012, 12:21   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

разница между UDPClient и UDPServer чисто условная, в юдп нет ни клиентов, ни серверов (в понимании TCP).

А начать слушать юдп порт можно тремя строчками:

socket();
bind();
recv();

Если нужно отправить данные, после bind() используем sendto(). Вот и всё, где тут сервер, где клиент?

Использовать для этого сторонние компоненты — себе вредить. Оправданием может служить только поднятие какого-то условно сложного протокола.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не полностью принимаются данные через UDP порт Terran Работа с сетью в Delphi 6 26.01.2011 16:56
Получение команды на UDP порт и выполнение по ней действия monty "2" Работа с сетью в Delphi 1 29.04.2010 23:35
Байден посоветовал Саакашвили слушать маму Mr.Qwerty Свободное общение 0 23.07.2009 23:21
UDP и данные Shouldercannon Работа с сетью в Delphi 4 30.07.2008 09:12