Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.09.2010, 20:55
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
Восклицание UdpSocket

Хочу сделать что то на подобии чата с использованием компонента UdpSocket... Помогите... Нужен самый простой, и примитивный пример с использованием именного этого компонента!!! Заранее благодарен!
Ответить с цитированием
  #2  
Старый 24.09.2010, 21:03
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Обычно я использую поиск. Вот нашел такой ответик:
Цитата:
В папке \delphi\demos\indy лежат примеры по применению данной библиотеки
Проверьте, может это правда.
А вот оттуда-же пример:
Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, Winsock, StdCtrls;
 
const
  HST_BROADCAST: String = '255.255.255.255';
  MAX_UDP_SIZE: Integer = 8192;
  WM_ASYNC = WM_USER + 1;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  public
    FHandle: HWND;
    procedure SockWND(var AMsg: TMessage); message WM_ASYNC;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  FWSAData: TWSAData;
  FSockAddr: TSockAddrIn;
  FSocket: HWND;
  Option: Boolean;
  Data: String;
begin
  WSAStartup($0101, FWSAData);
  FSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  with FSockAddr do
  begin
    sin_addr.S_addr := INADDR_BROADCAST;
    Option := True;
    SetSockOpt(FSocket, SOL_SOCKET, SO_BROADCAST, PChar(@Option), SizeOf(Option));
    sin_port := htons(6767);
    sin_family := AF_INET;
  end;
  Data := 'My first broadcast message!!!';
  SendTo(FSocket, Data[1], Length(Data), 0, FSockAddr, SizeOf(FSockAddr));
  closesocket(FSocket);
  WSACleanup;
end;
 
procedure TForm1.SockWND(var AMsg: TMessage);
var
  Buffer: array [0..8191] of Char;
  Size: Integer;
  SockAddr: TSockAddrIn;
begin
  with AMsg do
    case Msg of
    WM_ASYNC:
    begin
      case WSAGetSelectEvent(LParam) of
        FD_READ:
        begin
          FillChar(Buffer, 8192, #0);
          Size := SizeOf(SockAddr);
          recvfrom(WParam, Buffer[0], MAX_UDP_SIZE, 0, SockAddr, Size);
          ShowMessage(StrPas(@Buffer));
          DeallocateHWnd(FHandle);
          closesocket(WParam);
          WSACleanup;
        end;
      end;
    end
    else
      DefWindowProc(FHandle, Msg, WParam, LParam);
    end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  FWSAData: TWSAData;
  FSockAddr: TSockAddrIn;
  FSocket: HWND;
  Option: Boolean;
  Data, SrvHost: String;
begin
  WSAStartup($0101, FWSAData);
  FSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  with FSockAddr do
  begin
    SrvHost := '192.168.2.108'; // Это IP сервака (т.е. нашей машины)
    sin_addr.S_addr := inet_addr(PChar(SrvHost));;
    Option := True;
    SetSockOpt(FSocket, SOL_SOCKET, SO_BROADCAST, PChar(@Option), SizeOf(Option));
    sin_port := htons(6767);
    sin_family := AF_INET;
  end;
  bind(FSocket, FSockAddr, SizeOf(FSockAddr));
  FHandle := AllocateHWnd(SockWND);
  WSAAsyncSelect(FSocket, FHandle, WM_ASYNC, FD_READ);
end;
 
end.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 24.09.2010 в 21:07.
Ответить с цитированием
  #3  
Старый 25.09.2010, 02:18
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
По умолчанию

Цитата:
Сообщение от Страдалецъ
Обычно я использую поиск. Вот нашел такой ответик:

Проверьте, может это правда.
А вот оттуда-же пример:
Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, Winsock, StdCtrls;
 
const
  HST_BROADCAST: String = '255.255.255.255';
  MAX_UDP_SIZE: Integer = 8192;
  WM_ASYNC = WM_USER + 1;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  public
    FHandle: HWND;
    procedure SockWND(var AMsg: TMessage); message WM_ASYNC;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  FWSAData: TWSAData;
  FSockAddr: TSockAddrIn;
  FSocket: HWND;
  Option: Boolean;
  Data: String;
begin
  WSAStartup($0101, FWSAData);
  FSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  with FSockAddr do
  begin
    sin_addr.S_addr := INADDR_BROADCAST;
    Option := True;
    SetSockOpt(FSocket, SOL_SOCKET, SO_BROADCAST, PChar(@Option), SizeOf(Option));
    sin_port := htons(6767);
    sin_family := AF_INET;
  end;
  Data := 'My first broadcast message!!!';
  SendTo(FSocket, Data[1], Length(Data), 0, FSockAddr, SizeOf(FSockAddr));
  closesocket(FSocket);
  WSACleanup;
end;
 
procedure TForm1.SockWND(var AMsg: TMessage);
var
  Buffer: array [0..8191] of Char;
  Size: Integer;
  SockAddr: TSockAddrIn;
begin
  with AMsg do
    case Msg of
    WM_ASYNC:
    begin
      case WSAGetSelectEvent(LParam) of
        FD_READ:
        begin
          FillChar(Buffer, 8192, #0);
          Size := SizeOf(SockAddr);
          recvfrom(WParam, Buffer[0], MAX_UDP_SIZE, 0, SockAddr, Size);
          ShowMessage(StrPas(@Buffer));
          DeallocateHWnd(FHandle);
          closesocket(WParam);
          WSACleanup;
        end;
      end;
    end
    else
      DefWindowProc(FHandle, Msg, WParam, LParam);
    end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  FWSAData: TWSAData;
  FSockAddr: TSockAddrIn;
  FSocket: HWND;
  Option: Boolean;
  Data, SrvHost: String;
begin
  WSAStartup($0101, FWSAData);
  FSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  with FSockAddr do
  begin
    SrvHost := '192.168.2.108'; // Это IP сервака (т.е. нашей машины)
    sin_addr.S_addr := inet_addr(PChar(SrvHost));;
    Option := True;
    SetSockOpt(FSocket, SOL_SOCKET, SO_BROADCAST, PChar(@Option), SizeOf(Option));
    sin_port := htons(6767);
    sin_family := AF_INET;
  end;
  bind(FSocket, FSockAddr, SizeOf(FSockAddr));
  FHandle := AllocateHWnd(SockWND);
  WSAAsyncSelect(FSocket, FHandle, WM_ASYNC, FD_READ);
end;
 
end.
Всё это конечно хорошо!!! Но компонент находится на вкладке Internet и не относится никак к Indy!!! Нужен именно TUdpSocket!
Ответить с цитированием
  #4  
Старый 25.09.2010, 06:59
Proger10 Proger10 вне форума
Прохожий
 
Регистрация: 02.03.2009
Сообщения: 26
Репутация: 10
По умолчанию

TUdpSocket насколько знаю немного косой. Он может только отправлять. Когда самому надо было делать программу на udp, писал все на winсокетах.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:46.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter