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.