Oppure

Loading
22/04/08 14:59
punkettone90
ciao, ho fatto un programma che ascolta in una socket, il problema è che quando la faccio ascoltare non in una lan, ma su internet, tantissimi server si attaccano (1 ogni 2 secondi) facendomi partire inutilmente i threads dedicati a servire i client; come posso filtrare le richieste? pensavo a un sistema di autenticazione del mio client ma questo fa si che il metodo receive() del server mi blocchi il thread di ascolto aspettandosi dei dati che magari non arrivano mai.
come posso fare?

grazie!
aaa
23/04/08 11:19
gantonio
Non puoi fare nulla da programma ...

Se hai un router/firewall che prevede il filtraggio dell'IP che si puo' collegare ad una porta, puoi impostare l'IP del client che vuoi fare collegare in modo che gli altri tentativi vengano bloccati prima di arrivare al tuo server.
aaa
23/04/08 21:37
punkettone90
e invece credo si possa fare qualcosa, pensavo ad esempio ad una specia di autentificazione da parte del client per cui non appena si attacca manda una certa sequenza di byte, in questo modo riesco a far partire i thread di servizio solo se l'autentificazione va a buon fine, il problema è che il metodo receive() blocca il thread finchè non riceve qualcosa, è possibile metterci un timeout a quel metodo?

grazie :-?
ps: fatto pace con quello delle picturebox? asd
aaa
24/04/08 4:15
gantonio
Non ho presente l'architettura del tuo programma, ma la connessione avviene comunque a prescindere da qualsiasi processo di autenticazione che presuppone una connessione e uno scambio dati.

Quindi, per iniziare una qualsiasi sequenza di "riconoscimento", deve essersi stabilita la comunicazione e il thread e' gia' stato avviato.
aaa
24/04/08 8:01
punkettone90
mmm no


tmpclientsocket = ascoltando.AcceptSocket();

contprocUI += 1;
args[0] = ("";);
this.Invoke(UIDel, args);

args[0] = ("si è connesso un utente da " + tmpclientsocket.RemoteEndPoint);
this.Invoke(UIDel, args);

contenitoreindirizzi.aggiungi(tmpclientsocket);



metodoprocesso[contprocUI] = new serverprocessor();

metodoprocesso[contprocUI].inizializza(contprocUI);

processi[contprocUI] = new Thread(new ThreadStart(metodoprocesso[contprocUI].process));

processi[contprocUI].Start();

args[0] = "il processo è stato inizializzato correttemente";
this.Invoke(UIDel, args);


parte il thread per accettare nuove connessioni, ma volevo sapere se potevo mettere un tempo massimo per cui le nuove richieste, se non mandano l'autentificazione entro un tot di tempo, vengano ignorate e il ciclo del thread può ripartire
aaa
24/04/08 8:18
punkettone90
nel senso, mi spiego meglio, so bene che ascoltando.aceptsocket() viene eseguito a prescindere dall'autentificazione, ma dopo questo pensavo di mettere un .receive() e se l'autentificazione è giusta parte il thread di servizio, il problema è che qualcuno (non con il mio client) si può attaccare su quella porta e se non manda neanche un byte, il thread delle nuove connesioni si blocca; perfino con telnet uno potrebbe bloccarmi!
aaa
24/04/08 8:37
gantonio
Un attimo ... capiamoci ...

La normale "architettura" server multithread, a blocchi, e' la seguente

- Il thread 1 in cui il socket e' in listening

- Viene accettatta una connessione
- Parte un thread N-simo in cui viene
gestita la nuova connessione

- Il thread 1 continua a girare rimettendosi in listening attendendo altre connessioni

Quindi, un thread deve essere SEMPRE in listening e questo accetta "comunque" una nuova connessione, da dovunque essa provenga.

La nuova connessione viene gestita (in termini di comunicazione) da un nuovo thread.

In questo modo non hai la possibilita' di limitare le connessioni (naturalmente, puoi prestabilire un massimo numero di thread attivabili e di conseguenza un numero massimo di connessioni, ma non potrai "scegliere" chi puo' connettersi)

L'autenticazione e' una fase che avviene SEMPRE DOPO l'avvenuta connessione. Puo' servire a limitare l'accesso di client non autorizzati ma NON la loro connessione.

Per evitare le connessioni, ti ripeto, devi intervenire PRIMA, a livello di router/firewall ...
Ultima modifica effettuata da gantonio 24/04/08 8:38
aaa
24/04/08 9:38
punkettone90
si certo, ma una volta visto che non ricevo niente o ricevo byte che non hanno a che fare con la autenticazione, posso disconnettere la socket, come posso accettare la socket, posso poi anche chiuderla, il thread si blocca quando non riceve niente perchè se ricevesse qualcosa, il metodo .receive() termina e dopo aver esaminato i byte rievuti, se non sono del client posso disconnettere la socket e ricominciare ad ascoltare.

per quanto riguarda firewall e router non posso fare niente, un ip del tipo 134.563.23.130 può essere del mio compagno di scuola come anche di chissà quale cinese!
aaa