Форум: "Прочее";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
ВнизПомогите информацией об использовании UDP Найти похожие ветки
← →
@!!ex © (2008-02-20 17:14) [0]сабж
← →
Игорь Шевченко © (2008-02-20 17:15) [1]Сколько угодно:
http://www.google.ru/search?source=ig&hl=ru&rlz=&q=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+UDP&meta=
← →
@!!ex © (2008-02-20 17:16) [2]блин... я уже минут 40 ничего откопать не могу.. а тут - первая же ссылка. :\
← →
@!!ex © (2008-02-20 17:18) [3]Только там компонент, :(
← →
@!!ex © (2008-02-20 17:26) [4]Может у кого пример использования UDP Для рассылки сообщений на все компы в локалке есть?
← →
tesseract © (2008-02-20 17:30) [5]
> Может у кого пример использования UDP Для рассылки сообщений
> на все компы в локалке есть?
TUdpBase.Brodacast("прива всем",65535);
← →
@!!ex © (2008-02-20 17:31) [6]> [5] tesseract © (20.02.08 17:30)
> TUdpBase
Что такое TUDPBase?
← →
VirEx © (2008-02-20 17:31) [7]это вроде широковещательного адреса?
← →
tesseract © (2008-02-20 17:32) [8]
> Что такое TUDPBase?
точнее tIdUDPBase из INDY.
> это вроде широковещательного адреса?
UDP как правило для широковещательных запросов и используеться.
← →
@!!ex © (2008-02-20 17:34) [9]> [8] tesseract © (20.02.08 17:32)
формы нет... да к тому же TDE без indy. :(
← →
VirEx © (2008-02-20 17:43) [10]C:\Program Files\Borland\Delphi7\Demos\Internet\NetChat
← →
@!!ex © (2008-02-20 18:23) [11]Мда... самое смешное, что единственный, относительно нормальный, пример по работе с UDP содержится в книге Флёнова... :((
← →
easy © (2008-02-20 18:41) [12]http://delphiworld.narod.ru/base/send_broadcast_udp_package.html
← →
@!!ex © (2008-02-20 18:46) [13]> [12] easy © (20.02.08 18:41)
Отослать как понятно... А получить? :))
← →
Zeqfreed © (2008-02-20 19:15) [14]http://gnosis.cx/publish/programming/sockets2.html
См. разделыA UDP echo client in C
иA UDP echo server in C
. Найти было сложно до невозможности ;)
← →
easy © (2008-02-20 22:53) [15]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Winsock, StdCtrls;
const
WM_DATAREADY = WM_USER + 101;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FSocket:TSocket;
procedure WMDATAREADY(var AMsg: TMessage); message WM_DATAREADY;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
FWSAData: TWSAData;
SockAddr: TSockAddr;
SockOpt: Boolean;
begin
WSAStartup($101, FWSAData);
FSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
with SockAddr do
begin
sin_addr.S_addr := INADDR_ANY;
SockOpt := True;
SetSockOpt(FSocket, SOL_SOCKET, SO_BROADCAST, PChar(@SockOpt), SizeOf(SockOpt));
sin_port := htons(8167);
sin_family := AF_INET;
end;
Bind(FSocket, SockAddr, SizeOf(SockAddr));
WSAAsyncSelect(FSocket, Handle, WM_DATAREADY, FD_READ);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if FSocket <> INVALID_SOCKET then
CloseSocket(FSocket);
WSACleanup;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
SockOpt: Boolean;
Sock: TSocket;
SockAddr: TSockAddr;
SendStr: string;
begin
Sock:=Socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
with SockAddr do
begin
sin_addr.S_addr:=INADDR_BROADCAST;
SockOpt:=True;
SetSockOpt(Sock,SOL_SOCKET,SO_BROADCAST, PChar(@SockOpt),SizeOf(SockOpt)) ;
sin_port:=htons(8167);
sin_family:=AF_INET;
end;
SendStr:="UDP сообщение";
SendTo(Sock,SendStr[1],Length(SendStr),0,SockAddr,SizeOf(SockAddr));
CloseSocket(Sock);
end;
procedure TForm1.WMDATAREADY(var AMsg: TMessage);
var
Buffer: array [0..100] of Char;
Size: Integer;
SockAddr: TSockAddr;
begin
case WSAGetSelectEvent(AMsg.LParam) of
FD_READ:
begin
FillChar(Buffer, SizeOf(Buffer), 0);
Size := SizeOf(SockAddr);
RecvFrom(AMsg.WParam, Buffer, SizeOf(Buffer), 0, SockAddr, Size);
ShowMessage(StrPas(@Buffer));
end;
end;
end;
end.
← →
Сергей М. © (2008-02-20 23:00) [16]
> @!!ex © (20.02.08 17:34) [9]
> формы нет
Ты вроде бы, судя по прочим твоим постам, не формошлеп)..
Что, без форм уже никак ? Совсем заплохело что ли ?)
Какая нафих разница, есть Инди или нет Инди, есть форма или нет ее ?)
Делфи-объект - он и в Африке Делфи-объект. Форма ему нужна как формошлепу батон).. Или батоношлепу форма)
← →
@!!ex © (2008-02-21 07:38) [17]> [16] Сергей М. © (20.02.08 23:00)
Про то, что компоненты можно использовать без формы - я в курсе, вопрос как Indy поставить...
← →
@!!ex © (2008-02-21 07:39) [18]> [15] easy © (20.02.08 22:53)
Спасибо!
← →
tesseract © (2008-02-21 10:02) [19]
> Про то, что компоненты можно использовать без формы - я
> в курсе, вопрос как Indy поставить...
В TDE они есть. Просто невизуальные.
← →
Григорьев Антон © (2008-02-21 11:54) [20]
> @!!ex © (20.02.08 18:23) [11]
> Мда... самое смешное, что единственный, относительно нормальный,
> пример по работе с UDP содержится в книге Флёнова... :((
Ээээээ.... http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021#10 - про UDP вообще
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021#12 - про параметры сокета, в т.ч. про те, которые разрешают широковещательную рассылку
В книге ещё и готовые примеры есть. Правда, широковещательной рассылки там нет, но в UDP широковещательная рассылка от обычной отправки отличается только тем, что вместо IP-адреса компьютера ставится широковещательный адрес подсети. Скажем, если поставить адрес 192.168.35.255, то сообщение получат все компьютеры с адресами 192.168.35.X. Надо только помнить про TTL (Time To Live) - у широковещательных сообщений он по умолчанию 1, т.е. через маршрутизатор такие пакеты не пройдут. Надо узнать у админа, какой TTL для таких пакетов нужен, и установить его с помощью опции сокета IP_MULTICAST_TTL.
← →
Черный Шаман (2008-02-21 16:37) [21]Если через 10-тку Indy, то
отправить UDP пакет:
TIdUDPServer
1. IdUDPServer.BroadcastEnabled := True; послать всем в бродкастовом сегменте(где нет маршрутизаторов).
2. Отсылка сообщения через методы
- IdUDPServer1.Send(...)
- IdUDPServer1.SendBuffer(...);
Если IdUDPServer.BroadcastEnabled то пошлет всем в бродкастовой сети. Как делать multicast я не знаю.
Получить UDP пакет:
TIdUDPServer
1. IdUDPServer.ThreadedEvent := True; но в данном случае обработка пакета идет из нового потока, если взаимодействовать с VCL нужно обдумать синхронизацию с основным потоком VCL.
2. IdUDPServer.BroadcastEnabled := True; послать всем в бродкастовом сегменте(где нет маршрутизаторов).
3. Обработка пакета происходит в делегате события OnUDPRead
Компоненты Indy можно создавать в рантайме, формы они не требуют. Единственный недостаток - размер udp пакета не может превышать (512-40) - ~1500 байт в зависимости от размера MTU.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c