Sapendo che questo forum viene seguito da veterani di Delphi sono fiducioso di avere un aiuto.

Usando il componente TServerSocket ho bisogno di sapere quando una connessione non è più valida. E' quindi necessario attivare la funzione keepalive poiché non mi è consentito inviare caratteri dummy nella connessione e la connessione a volte può restare "muta" ma attiva a lungo.
Una volta che entra una connessione la funzione tenta di attivare il keepalive agendo direttamente sul socket per mezzo della funzione di Windows SetSockOpt e WSAIoctl

Mi potete dare una mano a farla funzionare?
Ecco quanto ho sccritto che però non mi funziona:

codice:
procedure TMainForm.ServerSocketGetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
const
  SIO_KEEPALIVE_VALS= IOC_IN or IOC_VENDOR or 4;
type TTcpKeepAlive= packed record
  OnOff, KeepAliveTime, KeepAliveInterval: u_long;
end;
var
  OptVal: Integer;
  KeepAliveIn, KeepAliveOut: TTcpKeepAlive;
  BytesReturned: Cardinal;
begin
  TMLog.Lines.Append('ServerSocketGetThread()');

  OptVal:= 1;
  if SetSockOpt(ClientSocket.SocketHandle, SOL_SOCKET, SO_KEEPALIVE, @OptVal, SizeOf(OptVal))<> SOCKET_ERROR then begin
    FillChar(KeepAliveIn, SizeOf(KeepAliveIn), 0);
    FillChar(KeepAliveOut, SizeOf(KeepAliveOut), 0);
    KeepAliveIn.OnOff:= 1;
    KeepAliveIn.KeepAliveInterval:= 500;
    KeepAliveIn.KeepAliveTime:= 500;
    if WSAIoctl(ClientSocket.SocketHandle, SIO_KEEPALIVE_VALS, @KeepAliveIn,  SizeOf(KeepAliveIn), @KeepAliveOut,  SizeOf(KeepAliveOut), BytesReturned, nil, nil)= SOCKET_ERROR then TMLog.Lines.Append('WSAIoctl() Error!!')
    else TMLog.Lines.Append(IntToStr(BytesReturned));
  end else TMLog.Lines.Append('SetSockOpt() Error!!');

  SocketThread:= TThTcpCLient.Create(ClientSocket, Self);
  TLThTcpCLient.Add(SocketThread);
end;