PDA

View Full Version : سوال: هنگ برنامه زمان گوش دادن به سوکت



Mohsen6558
یک شنبه 19 اردیبهشت 1389, 02:04 صبح
با سلام
دوستان برنامه ای نوشتم که به یه پورت از آی پی با TCP گوش می ده


اینم تکه کدش:
Try

client = listener.AcceptTcpClient()
Dim pi As PropertyInfo = client.GetStream.GetType.GetProperty("Socket", BindingFlags.NonPublic Or BindingFlags.Instance)
Dim PublicIP As String = pi.GetValue(client.GetStream, Nothing).RemoteEndPoint.ToString.Split(":")(0)


Dim ipend As Net.IPEndPoint = client.Client.RemoteEndPoint
If Not ipend Is Nothing Then
PublicIP = ipend.Address.ToString
End If

netStream = client.GetStream()

'Console.WriteLine("Status: 1 Handling client...")
Dim totalByteRcvd As Integer = 0
While ((byteRcvd = netStream.Read(byteBuffer, totalByteRcvd, byteBuffer.Length - totalByteRcvd)) > 0)

netStream.Write(byteBuffer, 0, byteRcvd)
totalByteRcvd += byteRcvd

End While

حالا برنامه می آد و تو سطر client = listener.AcceptTcpClient() متوقف می شه تا اطلاعاتی از پورت برسه در اون حالت رابط کاربری برنامه هنگ می کنه!
من می خوام این مشکل پیش نیاد باید چیکار کنم؟
مرسی

Mohsen6558
یک شنبه 19 اردیبهشت 1389, 02:07 صبح
من اصلا با چندلایه کار نکردم
اگه امکانش هست بصورت عملی بفرمایین که اگه تنها راهش استفاده از اون هست چطوری رو این پیدا سازی کنم

هسته ی برنامه همینه در واقع بقیه تعدادی تابع هستن که اون رشته ای که دریافت شده رو تفکیک می کنن

متشکر

sadra_r2235
یک شنبه 19 اردیبهشت 1389, 03:22 صبح
دوست عزیز وقتی listener داره به یه پورت گوش میده ،همون جا منتظر میمونه تا یه ip بهش درخواست اتصال بده برای اینکه بخواد به پورت گوش بده به صورت حلقه بی نهایت همش پورت مربوطه رو چک میکنه،
عد شما فکر می کنید که هنگ کرده. برای رفع مشکل ، دو راه دارید:
1.استفاده از multi theread که خودش یه بحث طولانی ولی کارامده.
2.استفاده از timer که میتونی تمام کدت رو تو timer_Tick بنویسی و توform_load ،تایمر رو فعال کنی.
اینتوری میتونی با خاصیتinterval تایمرکنترلش کنی.
تایمر باعث میشه مثلا هر 100 میلی ثانیه یک بار listener به پورت گوش بده و سی پی یو همش به صورت مداوم در گیر نشه. و شما بتونی control user داشته باشی.
ولی از همه بهترش اینه که اگه میخوای برنامه نویس سوکت بشی اول حتما theread و بعد multi theread رو یاد بگیر. چون بعدا که برنامتو نوشتی و listener بخواد به صورت همزمان به چند پورت گوش بده اونجا برنامت error میده ،چون وقتی یک ip رو اکسپت میکنه دیگه نمیتونه به پورت های دیگه گوش بده ، پس هنگ میکنه. یادت باشه حتما تو try catch بزاری. موفق باشی

Mohsen6558
یک شنبه 19 اردیبهشت 1389, 12:36 عصر
با تشکر از راهنمایی این دوستمون
من از این روش استفاده کردم که یه
If listener.Pending = True Then
بالای خط
client = listener.AcceptTcpClient()
قرار دادم تا اگه مطمین بشم که اول ارسالی منتظر هست بعد بخونم