Ahora uno un poco mas complicado, aunque prometo buscar alguno mas sencillo
Pues bien, el siguiente código sirve para montar un servidor de números aleatorios. Cuando se ejecuta la función "Aleator" el programa se pone a escuchar por el puerto 1978, y cuando alguien se conecta a el, comienza a enviarle números aleatorios a intervalos de 100 milisegundos.
Código Delphi
[-]
uses
Windows, SysUtils, Winsock;
function ThreadProc(Socket: TSocket): Integer;
var
Str: String;
begin
Result:= 0;
try
repeat
Sleep(100);
Str:= IntToHex(Random(MAXINT),8);
until send(Socket,PChar(Str)^,Length(Str)+1,0) = SOCKET_ERROR;
finally
Shutdown(Socket,SD_SEND); CloseSocket(Socket);
EndThread(0);
end;
end;
procedure Aleator;
var
WSADATA: TWSADATA;
ServerSocket: TSocket;
LocalAddr: TSockaddr;
ClientSocket: TSocket;
RemoteAddr: TSockaddr;
AddrSize: Integer;
FDSet: TFDSet;
TimeVal: TTimeVal;
ThreadId: LongWord;
begin
Randomize;
if WSAStartup(MAKEWORD(1, 1), WSADATA) = 0 then
try
ServerSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if ServerSocket <> INVALID_SOCKET then
begin
with LocalAddr do
begin
sin_family := AF_INET;
sin_port := htons(1978);
sin_addr.s_addr := htonl(INADDR_ANY);
end;
if bind(ServerSocket, LocalAddr, sizeof(LocalAddr)) <> SOCKET_ERROR then
if listen(ServerSocket, SOMAXCONN) <> SOCKET_ERROR then
begin
repeat
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 500;
FD_ZERO(FDSet);
FD_SET(ServerSocket, FDSet);
if select(0, @FDSet, nil, nil, @TimeVal) > 0 then
begin
AddrSize := sizeof(RemoteAddr);
ClientSocket := accept(ServerSocket, @RemoteAddr, @AddrSize);
if ClientSocket <> INVALID_SOCKET then
BeginThread(nil, 0, @ThreadProc, Pointer(ClientSocket),
0, ThreadID);
end;
until FALSE; end;
end;
finally
WSACleanup();
end;
end;
Para probarlo solo tenemos que usar, por ejemplo, el telnet:
Código:
telnet 127.0.0.1 1978