Quando lancio il comando
IdTcpServer.Active:= false;
se ci sono delle connessioni in corso il programma si pianta. Come posso fare per abbattere tutte le connessioni in corso?
Grazie mille, Denis.
Quando lancio il comando
IdTcpServer.Active:= false;
se ci sono delle connessioni in corso il programma si pianta. Come posso fare per abbattere tutte le connessioni in corso?
Grazie mille, Denis.
Quale versione di Indy usi?Come posso fare per abbattere tutte le connessioni in corso?
10
Prova con una cosa del genere prima di disattivare il server:
codice:if IndyTCPServer.Contexts <> nil then begin with IndyTCPServer.Contexts.LockList do try for i := 0 to Count - 1 do TIdContext(Items[i]).Connection.Disconnect(False); finally IndyTCPServer.Contexts.UnlockList; end; end;
Le connessioni vengono abbattute correttamente ma poi alla riga
IdTcpServer.Active:= false;
il programma si pianta.
Purtroppo non è un'informazione sufficiente per individuare la causa del problema, potrebbe trattarsi in egual misura di un bug molto subdolo oppure di un errore macroscopico. :master:IdTcpServer.Active:= false; il programma si pianta.
Nella finestra Thread Id vedo che quando apro il socket viene instanziato il Thread
IdTcpServer Listener
il quale a sua volta quando arriva una connessione instanzia il Thread
IdTcpServerScheduler
uno per ogni connessione entrante.
Con la funzione da te suggerita vengono terminate le connessioni ma l'oggetto ..Scheduler rimane attivo. Forse la soluzione sta nel riuscire ad abbatterlo. Hai qualche idea?
Siamo sicuri che il problema non sia dovuto a codice inserito "a contorno" dei componenti, e non ai componenti stessi?
Uso la medesima versione di Indy, ed ho un programma che apre due server di tipo POP3 e SMTP, senza riscontrare questo problema.
MARCO BREVEGLIERI
Software and Web Developer, Teacher and Consultant
Home | Blog | Delphi Podcast | Twitch | Altro...
Ho preparato un programmino che non fa nulla, solo per provare il componete TIdTcpServer.
Prova a creare un form con un componente TIdTcpServer, attivare il socket, scrivere qualcosa in OnExecute ('TMLog.Lines.Add('IdTCPServerExecute');'.. quello che vuoi) e poi a collegarti con HyperTerminal.
Prova ora a chiudere il programma e fammi sapere cosa succede. (Con telnet il programma si chiude senza problemi.)
Prova inoltre a riaprire il socket, collegarti in telnet da un secondo pc e staccare il cavo di rete del server. Fammi sapere se riesci a gestire l'errore 10054.
Ottimo caso di test riproducibile. Appena avrò un po' di tempo libero (merce rara in questo periodo) faccio qualche prova.Originariamente inviato da denis76
Prova a creare un form con un componente TIdTcpServer[...]
MARCO BREVEGLIERI
Software and Web Developer, Teacher and Consultant
Home | Blog | Delphi Podcast | Twitch | Altro...