A modo de ilustración, te muestro el servidor modificado para disparar un evento al recibir un mensaje desde el cliente. En este caso, el formulario incorpora un TLabel donse se escribirá el mensaje de texto recibido. Uso un mensaje de Windows pero también podrías modificarlo para usar Synchronize.
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, WinSock, StdCtrls;
const
WM_MSG = WM_USER + 1;
type
TServer = class(TThread)
private
FWND: HWND;
protected
procedure Execute; override;
public
constructor Create(const WND: HWND);
end;
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
private
Server: TServer;
procedure OnMsg(var Msg: TMessage); message WM_MSG;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TServer.Create(const WND: HWND);
begin
FWND:= WND;
inherited Create(false);
end;
procedure TServer.Execute;
const
BufferSize = 1024;
Port = 9090;
var
WSA: WinSock.TWSADATA;
Sock: WinSock.TSOCKET;
Addr: WinSock.sockaddr_in;
Buffer: array[0..BufferSize-1] of AnsiChar;
Len, AddrSize: integer;
dwTime: DWORD;
ValMulticast: AnsiCHAR;
begin
if (WinSock.WSAStartup(MakeWord(2, 2), WSA) <> 0) then exit;
Sock := WinSock.socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if (Sock <> INVALID_SOCKET) then
begin
dwTime:= 1000;
ValMulticast:= #1;
WinSock.setsockopt(Sock, SOL_SOCKET, SO_RCVTIMEO, PAnsiCHAR(@dwTime), sizeof(dwTime));
WinSock.setsockopt(Sock, SOL_SOCKET, SO_REUSEADDR, @ValMulticast, sizeof(ValMulticast));
WinSock.setsockopt(Sock, IPPROTO_IP, IP_MULTICAST_LOOP, nil, 1);
Addr.sin_family := AF_INET;
Addr.sin_addr.s_addr := INADDR_ANY;
Addr.sin_port := WinSock.htons(Port);
AddrSize := sizeof(Addr);
if (bind(Sock, Addr, AddrSize) <> -1) then
begin
while not Terminated do
begin
ZeroMemory(@Buffer[0], BufferSize);
Len := WinSock.recvfrom(Sock, Buffer, BufferSize-1, 0, Addr, AddrSize);
if (Len > 0) and (Len < BufferSize) then
begin
Windows.Beep(1000, 100);
Windows.SendMessage(FWND, WM_MSG, WPARAM(@Buffer[0]), 0);
end;
end;
end;
WinSock.closesocket(Sock);
end;
WinSock.WSACleanUp;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Server:= TServer.Create(Handle);
end;
procedure TForm1.OnMsg(var Msg: TMessage);
begin
Label1.Caption:= PAnsiChar(Msg.WParam);
end;
end.
Saludos