Καλησπέρα,
Γράφω ένα πρόγραμμα που συνδέεται σε μια διεύθυνση με TCP σύνδεση και διαβάζει δεδομένα. Επειδή τα δεδομένα δεν είναι πάντα διαθέσιμα έχω timeout του streamreader στα 5sec. Δυστυχώς όμως κάποιες φορές όταν κάνω .ReadLine() από τον StreamReader βλέπω το εξής exception:
{System.IO.IOException: Unable to read data from the transport connection: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.IO.StreamReader.ReadBuffer()
at System.IO.StreamReader.ReadLine()
at MSNPlugin.connectMSN.readData() in D:\projects\connect.cs:line 121}
Γιατί δεν κάνει απλά timeout το Read και πετάει exception? Αυτό το παθαίνω ακόμα και όταν βάλλω πολύ μικρό timeout πχ 1 ή 0,5 sec... Παρακάτω παραθέτω τον κώδικα:
TcpClient cl_Tcp = new TcpClient();
cl_Tcp.Connect(some_address, some_port);
if (cl_Tcp.Connected) {
NetworkStream ns = cl_Tcp.GetStream();
StreamReader sr = new StreamReader(ns);
sr.BaseStream.ReadTimeout = 5000; //5 sec
string dataRead = "";
bool ping_alive = true;
while (ping_alive) {
try { dataRead = sr.ReadLine(); } //EXCEPTION
catch (Exception exc) { ; }
if (dataRead == "") { //de brike tpt na diabasei
ping_alive = ping();//tsekarei an einai anixti i sindesi epistrefei true/false
Thread.Sleep(3000); //kimisou ligo mexri na brethoun dedomena gia diabasma
continue;
}
ProcessInput(dataRead); //epeksergasou ta dedomena
dataRead = "";
}
}
Στόχος μου είναι να αποφύγω το exception δηλαδή να μην εμφανίζεται ούτε στο console. Υπάρχει τρόπος;
Ευχαριστώ προκαταβολικά για την βοήθεια.