Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [Delphi] TServerSocket, KeepAlive

    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;

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    I componenti che usi sono obsoleti e hanno la fama di non essere particolarmente stabili: come mai non hai utilizzato Indy Components?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Perché ho bisogno di instanaziare un thread per ogni connessione entrante e con gli indy oppure ics non riesco a farlo.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da denis76
    Perché ho bisogno di instanaziare un thread per ogni connessione entrante e con gli indy oppure ics non riesco a farlo.
    Indy crea automaticamente un thread per ogni connessione entrante.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Il fatto è che con Indy non capisco come estendere la classe thread che si gestisce il socket di modo da implementarla secondo le mie esigenze.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.