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;

Rispondi quotando