Blog Stats
  • Posts - 55
  • Articles - 0
  • Comments - 1229
  • Trackbacks - 282

 

Ci rinuncio: è impossibile impostare il Timeout nelle con tcpClient e la Socket class

Sembra facile realizzare un semplice client tcp/ip: se ci si limita all'apertura di una connessione e la gestione delle eccezioni lo è certamente. Altra complessità è implementare un protocollo.

Volevo realizzare un semplice port scanner, cioè aprire una porta TCP/IP per verificarne la raggiungibilità.

Il problema è che non è possibile impostare il timeout. Ecco il codice di una semplice Console Application.

using System; using System.Net; using System.Net.Sockets; using System.Threading; namespace tcpopenport { internal class Program { private static void Main(string[] args) { string _host = "85.18.94.43"; int _port = 9000; int _timeout = 0; IPEndPoint iep = new IPEndPoint(IPAddress.Parse(_host), _port); TcpClient tcpclient = new TcpClient(); tcpclient.ExclusiveAddressUse = true; tcpclient.SendTimeout = _timeout; tcpclient.ReceiveTimeout = _timeout; try { tcpclient.Connect(_host, _port); Console.WriteLine("Connesso!"); } catch (Exception ex) { Console.WriteLine("Errore: " + ex.Message); } Console.ReadLine(); } } }

Nella documentazione è riportato che il valore da impostare è in millisecondi, ma deve esserci qualche errore negli esempi, visto che sembra che sia impostato in secondi: http://msdn2.microsoft.com/en-us/library/system.ne...

Feedback?


Feedback

# re: Ci rinuncio: è impossibile impostare il Timeout nelle con tcpClient e la Socket class

Gravatar Ho letto la documentazione che hai segnalato (il link è broken...) e dice che i timeout vengono conteggiati in corrispondenza di chiamate ai metodi Read() e Write() sullo stream. Il metodo Connect() non è menzionato.

Quindi ti tocca costruirti a mano la gestione del timeout sull'apertuta della connessione.

ciao
m. 8/22/2006 5:07 PM | Matteo

# Re: Ci rinuncio: è impossibile impostare il Timeout nelle con tcpClient e la Socket class

Gravatar scusa se mi permetto, ma questo post andrebbe messo sul forum, non sul blog, non mi sembra adatto sinceramente.
e comunque non usare la classe tcpclient, troppo semplicistica per gestire la connessione, usa direttamente la classe socket.
saluti 8/22/2006 5:42 PM | Roberto Messora

# re: Ci rinuncio: è impossibile impostare il Timeout nelle con tcpClient e la Socket class

Gravatar Capito che il semplice codice che avevo scritto era inadatto allo scopo (anche se scritto con le sockets). Non gestisce il timeout nella connect: è molto strano questo design dell'API. E' piuttosto comune che una connect fallisca, non è certo che il server remoto sia online o risponda a quella porta.
L'implementazione corretta è tramite sockets asincrone. La classe tcpClient diventa un piccolo e inutile esercizio d'incapsulare le socket sincrone.

Ho trovato un'implementazione piuttosto delle sockets nella BytesRoad.NetSuit Library (http://www.bytesroad.com/NetSuit/default.aspx), dove c'è una simpatica proprietà ConnectTimeout ;-) 8/22/2006 6:26 PM | Marco Trova

# Re: Ci rinuncio: è impossibile impostare il Timeout nelle con tcpClient e la Socket class

Gravatar non è quello che intendevo: ha utilizzato il blog per chiedere dei feedback ad un problema di sviluppo sw.
il fatto che nel blog si possa scrivere di tutto non c'entra. in genere il blog è un luogo dove esprimere i propri pensieri, non dove chiedere feedback, per quello ci sono gli ottimi forum. il problema è che se il blog viene utilizzato come se fosse il forum piano piano non sarai il solo a farlo e nascerà un uso del tutto improprio del blog fino ad arrivare alla confusione totale degli strumenti di community offerti.
un conto è scrivere le proprie impressioni circa esperimenti fatti su un particolare snippet di codice, un conto è postare una richiesta di "supporto tecnico".
saluti 8/22/2006 8:40 PM | Roberto Messora

# re: Ci rinuncio: è impossibile impostare il Timeout nelle con tcpClient e la Socket class

Gravatar ..e comunque era uno post-sfogo il mio.. :P 8/22/2006 9:28 PM | Marco Trova

Comments have been closed on this topic.
 

 

Copyright © Marco Trova