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;