TcpClient.متصل ترجع صحيح بعد العميل غير متصل ، ماذا يمكنني أن تستخدم بدلا من ذلك ؟

StackOverflow https://stackoverflow.com/questions/101708

  •  01-07-2019
  •  | 
  •  

سؤال

في VB.net أنا باستخدام TcpClient لاسترداد سلسلة من البيانات.أنا باستمرار التحقق .متصل المنشأة للتحقق من إذا كان العميل متصلا ولكن حتى إذا كان العميل قطع هذا لا يزال يعود صحيحا.ما يمكنني استخدام كحل لهذا ؟

هذا هو نسخة خفيفة أسفل من القانون الحالي:

Dim client as TcpClient = Nothing
client = listener.AcceptTcpClient
do while client.connected = true
   dim stream as networkStream = client.GetStream()
   dim bytes(1024) as byte
   dim numCharRead as integer = stream.Read(bytes,0,bytes.length)
   dim strRead as string = System.Text.Encoding.ASCII.GetString(bytes,0,i)
loop

كنت أعتقد على الأقل GetStream() استدعاء رمي استثناء إذا كان العميل قطع ولكن لقد أغلقت التطبيق الأخرى و هذا لا...

شكرا

تحرير الاقتراع العميل.المتاحة واقترح ولكن هذا لا يحل المشكلة.إذا لم يكن العميل 'acutally' متصلة متوفرة فقط بإرجاع 0.

المفتاح هو أن أحاول أن تسمح الاتصال تبقى مفتوحة واسمحوا لي أن الحصول على البيانات عدة مرات على نفس اتصال مأخذ التوصيل.

هل كانت مفيدة؟

المحلول

عندما NetworkStream.قراءة بإرجاع 0 ، ثم إغلاق الاتصال. المرجعية:

إذا لم تتوفر بيانات عن القراءة ، NetworkStream.قراءة طريقة منع حتى من البيانات المتاحة.لتجنب الحجب ، يمكنك استخدام DataAvailable المنشأة تحديد ما إذا كانت البيانات في قائمة الانتظار في شبكة الاتصال الواردة العازلة القراءة.إذا DataAvailable ترجع صحيح ، فإن عملية القراءة كاملة على الفور.فإن عملية القراءة قراءة البيانات بقدر ما هي عدد وحدات البايت التي يحددها حجم المعلمة. إذا كان المضيف البعيد إيقاف الاتصال ، وجميع البيانات المتاحة وقد وردت القراءة الطريقة كاملة على الفور والعودة صفر بايت.

نصائح أخرى

أفضل إجابة:

  if (client.Client.Poll(0, SelectMode.SelectRead))
                    {
                        byte[] checkConn = new byte[1];
                        if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
                        {
                            throw new IOException();
                        }
                    }

https://i.stack.imgur.com/Jb0X2.png

الرابط=https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.poll?view=netframework-4.0

تحتاج إلى إعداد الموقت أن يرسل رسالة إلى مأخذ توصيل الأخرى من وقت لآخر.

خافت TC جديدة TimerCallback(AddressOf بينغ)

القراد = مؤشر ترابط جديد.الموقت(TC, لا شيء, 0, 30000)

Sub Ping()
    Send("Stil here?")
End Sub

بدلا من الاقتراع العميل.متصل ربما استخدام NetworkStream خصائص لمعرفة ما إذا كان هناك لا يوجد المزيد من البيانات المتاحة ؟

على أية حال, هناك ONDotnet.com المادة مع طن من معلومات على المستمعين وغيرها.وينبغي أن تساعدك على الحصول على الماضي مشكلتك...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top