Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - selezione socket
Forum - C# / VB.NET - selezione socket

Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 16:59
Martedì, 22/04/2008
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!

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 13:19
Mercoledì, 23/04/2008
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.

PM Quote
Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 23:37
Mercoledì, 23/04/2008
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

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 6:15
Giovedì, 24/04/2008
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.

PM Quote
Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 10:01
Giovedì, 24/04/2008
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

PM Quote
Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 10:18
Giovedì, 24/04/2008
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!

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 10:37
Giovedì, 24/04/2008
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 il 24/04/2008 alle 10:38
PM Quote
Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 11:38
Giovedì, 24/04/2008
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!

PM Quote