Hola, estuve investigando como funcionan las sockets de windows y realicé este código. En una aplicación visual consigo realizar la aplicación cliente-servidor, pero desde una aplicación de consola no hay forma... si consigo que se conecte el cliente pero no soy capaz de recibir sus mensajes ni de enviarle nada
Código Delphi
[-]
unit Server;
interface
uses Windows, WinSock, Messages, SysUtils, Classes;
const
WM_WINSOCK_ASYNC_MSG = WM_USER + 2988;
type
TServer = class(TThread)
private
InitDllSock : TWSAData;
TCP: TSocket;
WHandle: THandle;
Msg: TMsg;
Addr: TSockAddrIn;
protected
procedure AWndProc( Msg: TMsg);
public
procedure SendStr(str: string);
constructor Create; reintroduce;
procedure Execute; override;
end;
implementation
procedure TServer.SendStr(Str: string);
begin
send(TCP, Pointer(Str)^, Length(Str), 0);
end;
procedure TServer.AWndProc( Msg: TMsg);
begin
case WSAGetSelectEvent(Msg.lParam) of
FD_ACCEPT:
begin
Writeln('Conexión entrante');
SendStr('Hola cliente');
end;
FD_READ: Writeln('Leyendo..');
FD_CLOSE: Writeln('Conexión cerrada');
end;
end;
procedure TServer.Execute;
var
sinsize: integer;
begin
WSAStartup( $0202, InitDllSock );
TCP := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
with addr do
begin
sin_family:= af_Inet;
sin_port:= hToNs(1234);
sin_addr.s_addr:= InAddr_Any;
end;
bind(TCP, addr, SizeOf( addr ) );
WSAAsyncSelect(TCP, WHandle, WM_WINSOCK_ASYNC_MSG,
FD_READ or FD_CLOSE or FD_ACCEPT );
listen( TCP, 1);
while not Terminated do
begin
If GetMessage(Msg,WHandle, 0, 0) then
begin
TranslateMessage(Msg);
Accept( TCP, @addr, @sinsize);
DispatchMessage( Msg );
AWndProc(Msg);
Sleep(7000);
SendStr('holaaaa');
end;
end;
end;
constructor TServer.Create;
begin
inherited Create(True);
FreeOnTerminate:= True;
Execute;
end;
end.
Código Delphi
[-]
program Servidor;
{$APPTYPE CONSOLE}
uses
Server in 'Server.pas';
begin
TServer.Create;
end.
Saludos y gracias.