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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2014, 09:32   #1
kestugar
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 28
Радость Простейший UDP Client - Server (RAD Studio XE2 Delphi)

сервер запускается, но чтение IdUDPServer1UDPRead не выполняется.
подскажите пожалуйста почему сервер не читает?
брал часть кода отсюда http://www.ithowto.ru/66-primer-rabo...dp-server.html
часть еще где-то. Все что в интернете нашел - под delphi 7.
Пытался переделать под xe2 - не получилось. Что нужно сделать, чтобы под xe2 работало?
Код:
unit UDP;
 
type t_trackpacket = record
    packet_version: shortint;
    port: shortint;
    flags: integer;
    software: array [0..31] of byte;
    version: array [0..15] of byte;
    platform_: array [0..31] of byte;
    server_desc: array [0..63] of byte;
    server_location: array [0..63] of byte;
    server_url: array [0..95] of byte;
    contact_name: array [0..63] of byte;
    contact_email: array [0..63] of byte;
    users: integer;
    channels: integer;
    games: integer;
    uptime: integer;
    total_games: integer;
    total_logins: integer;
end;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    IdUDPClient1: TIdUDPClient;
    IdUDPServer1: TIdUDPServer;
    procedure Button1Click(Sender: TObject);
    //procedure IdUDPServer1AfterBind(Sender: TObject);
    procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
      AData: TArray<System.Byte>; ABinding: TIdSocketHandle);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var t: t_trackpacket;
Buf: TIdBytes;
begin
//  try
//    IdUDPClient1.Active := True;
//    IdUDPClient1.Host := 'localhost';
//    IdUDPClient1.Connect;
//    if IdUDPClient1.Connected  then
//      begin
//        IdUDPClient1.Send(TimeToStr(Time));
//        //Label1.Caption := 'ok';
//      end;
//    IdUDPClient1.Active := False;
//    Beep;Beep;Beep;
//  except
//    MessageDlg('Что-то не получилось =(', mtError, [mbOk], 0);
//  end;
 
  t.flags:= strtoint(edit1.Text);
  //Bytes := RawToBytes((t.flags^, t.size);
  IdUDPClient1.SendBuffer('localhost', 800, RawToBytes (t, sizeof(t)));
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  IdUDPServer1.Active := True;
end;
 
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
      AData: TArray<System.Byte>; ABinding: TIdSocketHandle);
var packet: t_trackpacket;
  i:Integer;
  s:String;
begin
  s := '';
    //s := BytesToString(AData, TEncoding.UTF8);
    i := 0;
    while (AData[i] <> 0) do
      begin
      s := s + chr(AData[i]);
      i := i + 1;
      end;
  //Adata.Read(packet, SIZEOF(packet));
  //Adata.ReadBuffer(packet, SIZEOF(packet));
 
  edit2.Text:= s;
  //edit2.Text:= inttostr(packet.flags)
end;
 
end.
kestugar вне форума Ответить с цитированием
Старый 14.07.2014, 09:37   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А в каком смысле не читает? Событие чтения не вызывается? Ты туда точку прерывания ставил?
Попробуй после отсыла дисконнект сделать - будет сервер читать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2014, 09:55   #3
kestugar
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А в каком смысле не читает? Событие чтения не вызывается? Ты туда точку прерывания ставил?
Попробуй после отсыла дисконнект сделать - будет сервер читать?
да, ставил точку - не вызывается =\

так тоже не работает:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var t: t_trackpacket;
Buf: TIdBytes;
begin
  t.flags:= strtoint(edit1.Text);
  //Bytes := RawToBytes((t.flags^, t.size);
  IdUDPClient1.SendBuffer('localhost', 800, RawToBytes (t, sizeof(t)));
  IdUDPClient1.Disconnect;
  //IdUDPServer1.Active := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  IdUDPServer1 := TIdUDPServer.Create(nil);
  IdUDPServer1.Active := True;
  IdUDPServer1.OnUDPRead := IdUDPServer1UDPRead;
  //IdUDPServer1.ThreadedEvent   := True;
end;
kestugar вне форума Ответить с цитированием
Старый 14.07.2014, 10:05   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... А SendBuffer какое-то исключение выдает? может Time Out или Closed Gracefull?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2014, 10:30   #5
kestugar
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 28
По умолчанию

нет =\
перепроверил, что подключил к компоненту IdUDPServer1 процедуру по свойству onRead.
Могут быть какие то внешние зависимости?
kestugar вне форума Ответить с цитированием
Старый 14.07.2014, 11:12   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Могут быть какие то внешние зависимости?
На сервере OnConnect срабатывает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2014, 11:29   #7
kestugar
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
На сервере OnConnect срабатывает?
такого свойства у UdpServer не нашел. это свойство? где это?

Последний раз редактировалось kestugar; 14.07.2014 в 11:37.
kestugar вне форума Ответить с цитированием
Старый 14.07.2014, 11:37   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ой туплю!!! UDP...
Сорри, видимо погода давит.
Файерволл настроен должным образом на 800-й порт?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2014, 11:45   #9
kestugar
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ой туплю!!! UDP...
Сорри, видимо погода давит.
Файерволл настроен должным образом на 800-й порт?
в параметрах UdpServer настроил DefaultPort на 800. это то?

P.S. попробовал отправку через функцию Send: тоже не работает =\
IdUDPClient1.Send(inttostr(t.flags) );
kestugar вне форума Ответить с цитированием
Старый 14.07.2014, 11:54   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не, я имел ввиду может файерволл операционки не пропускает.
Ну брандмауэр который. Или файерволл антивирусника, если есть. Его проверь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi Server & Client Socket Fiesko Общие вопросы Delphi 4 14.04.2013 20:50
RAD Studio XE2, глючат переходы и рефакторинг Hottabych Общие вопросы Delphi 7 03.02.2013 16:34
Server/Client на Delphi FlipOK Помощь студентам 4 07.01.2013 17:34
Rad Studio XE2 + Веб сервер Sm1Le Работа с сетью в Delphi 13 10.08.2012 17:10
Создание форм в Embarcadero RAD Studio XE2 ВалекFCRK Общие вопросы Delphi 6 09.03.2012 15:17