PDA

View Full Version : مشکل هنگ کردن ، هنگام Recive کردن از یک پورت (UDP)



littledemon
سه شنبه 27 فروردین 1392, 16:54 عصر
سلام . . .
رفقا من یه کدی شبیه زیر نوشتم واسه کانکت شدن به یه پورت UDP روی Remote IP و خوندن اطلاعات از اون(کد ها مال MSDN هست . چون فکر کردم کدهای خودم اشکال داره با اینا تست کردم که نتیجه باز هم جالب نبود )
ولی مشکل اینه که دقیقا وقتی میخواد Recive انجام بشه برنامه همینطور هاج و واج میمونه !:لبخند:
هیچ کاری مفیدی انجام نمیده و هی منتظر میمونه > چرا ؟
مخم قفل کرده راستش . راهنمایی کنید ممنون میشم.:لبخندساده:



public void GETUDP(string server)
{

Byte[] ByteGet = ASCII.GetBytes(Get);
Byte[] RecvBytes = new Byte[256];

try
{
Socket s = null;
IPEndPoint hostEndPoint;
IPAddress hostAddress = null;
int conPort = 58577;
hostAddress =IPAddress.Parse("10.8.0.10");
hostEndPoint = new IPEndPoint(hostAddress, conPort);
s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.Connect(hostEndPoint);

Int32 bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);

while (bytes > 0)
{
bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);
}
MessageBox.Show("len : "+bytes.ToString());
}catch(Exception x){
MessageBox.Show(x.Message);
}
}

littledemon
سه شنبه 27 فروردین 1392, 17:53 عصر
اصلا این روشی که ما رفتیم روی IP های Remote کار میده ؟ یا فقط مال لوکاله ؟
یکی اینا رو برا من روشن کنه لطفا . من تو تئوریش هم قفلیدم !!

tooraj_azizi_1035
سه شنبه 27 فروردین 1392, 18:05 عصر
سلام
در این لینک گفته اگر داده ای در کار نباشه متد Receive بلوک میشه:http://msdn.microsoft.com/en-us/library/8s4y8aff.aspx

If no data is available for reading, the Receive (http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.receive.aspx) method will block until data is available,
در بخش Remarks پنج مورد If هست اونارو بخون.

littledemon
چهارشنبه 28 فروردین 1392, 11:05 صبح
ممنون بسیار .
اما :
من با کد زیر وصل میشم و تست میکنم که آیا دیتا روی فلان پورت Ip موجوده یا نه ؟ که هی 0 بر می گردونه ! من موندم وقتی برنامه مو داخل Firewall کنترل میکنم میبینم دائم داره روی 0.0.0.0 پورت ها رو چک میکنه ، حدودا از پورت 65535 به صورت معکوس شروع میکنه و میاد عقب !!! چرا آخه ؟ مگه من بهش پورت و آی پی ندادم بهش ؟ چرا به اون وصل نمیشه ؟



Socket m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPAddress ip = IPAddress.Parse("10.8.0.6");

m_socket.Connect(new IPEndPoint(ip,6112));

DisplayPendingByteCount(m_socket);






public void DisplayPendingByteCount(Socket s)
{
byte[] outValue = BitConverter.GetBytes(0);

// Check how many bytes have been received.
s.IOControl(FIONREAD, null, outValue);

uint bytesAvailable = BitConverter.ToUInt32(outValue, 0);
if(bytesAvailable>0)
listBox1.Items.Add(string.Format("server has {0} bytes pending. Available property says {1}.",
bytesAvailable, s.Available));

return;
}

littledemon
چهارشنبه 28 فروردین 1392, 13:05 عصر
علاوه بر اینا سوال دومم رو هم تکرام میکنم و هم یه چیزی بهش اضافه میکنم.
این روشی که من کانکت میکنم مشکلی نداره ؟ بعضی ملت اومدن میگن با Bind باید کار کرد .ولی خوب مگه bind مال لوکال نیست ؟ من این IP که دادم ریموته .

littledemon
چهارشنبه 28 فروردین 1392, 15:52 عصر
خوب خوب خوب .

دوستان من مشکل اتصال رو کلا حل کردم .

حالا من باب احتیاط برای آیندگان بگم که ::لبخند:
- بحث هنگ کردن همون طور که tooraj_azizi_1035 عزیز گفتند حل شد .
-بحث 0 برگردوندن آی پی هم عیب از پیاده سازی اتصال UDP بود که با کد زیر حل شد :




byte[] AK=Encoding.UTF8.GetBytes("answer me");

UdpClient clc = new UdpClient(6112);
clc.Connect("10.8.0.6",6112);
clc.Client.ReceiveTimeout = 5000;

IPEndPoint ipend=new IPEndPoint(IPAddress.Any,0);
clc.Send(AK, AK.Length);
getbyte = clc.Receive(ref ipend);

listBox1.Items.Add(Encoding.ASCII.GetString(getbyt e));


برای مشکل جدید ترجیح میدم یه تاپیک دیگه بزنم .

FastCode
چهارشنبه 28 فروردین 1392, 16:52 عصر
اگر بدونید UDP مخفف چی هست و چرا میفهمید که همیشه صفر برمیگردونه.

راه پیشنهادی مشکل شما استفاده از method های Async شامل BeginReceive و EndReceive هست
میتونید در صورتی که سرعت کار براتون مهمه از Thread هم استفاده کنید.

در کل اگر نمیدونید UDP چی هست بهتون پیشنهاد میکنم استفاده نکنید چون پیاده سازی چیزی که اطمینانی مثل TCP یا RDP یا RUDP رو بهتون بده خیلی سخت تر از چیزی هست که فکر میکنم بتونید درک کنید.

و چون میدونم الان چه درخواستی میدید. نه.بلدم ولی من براتون نمینویسم چون وقت ندارم.

littledemon
چهارشنبه 28 فروردین 1392, 17:13 عصر
:لبخند:
من که چیزی نگفتم هنوز !
خوب من از این روش واسه شبیه سازی Lan روی اینترنت استفاده میکنم توی بحث Game
من بازی هایی که امکان انلاین بازی کردن رو نداره رو با استفاده از یه vpn میخوام با هم Lan کنم . حالا وقتی یه بازیکن هاست میشه و بازیش روی Lan عمل broadcast انجام میده.من باید با این نرم افزار بخونم اون داده ها رو و به بازی رو سیستم خودم پاس بدم .

حالا بحث اینه که خود game هم اطلاعاتش رو روی udp میده و منم برای استفاده از پورت اون و پیام هایی که broadcast شده میام و از پروتکل udp استفاده میکنم که به مشکل برخوردم... حالا بماند که بحث صفر برگردوندن رو حل کردم . اما الان روی وی پی ان دیگه هیچ broadcast ای رو نمیتونم بگیرم .. گویا دیگه چیزی وجود نداره . اما این بحث روی local جواب میده ...

حالا من کد نمیخوام . فقط کمی اطلاعات میخوام:لبخند:
در ضمن اونطرف هم هم پورت بازه و هم فایروال جلوش رو نگرفته .

FastCode
چهارشنبه 28 فروردین 1392, 17:19 عصر
میخواهی اطلاعات یک برنامه دیگه رو بخونی؟
wireshark
pcap

littledemon
چهارشنبه 28 فروردین 1392, 17:56 عصر
خوب از اونا چه نتیجه ای دستگیر من میشه ؟ من با WIRESHARK زدم تست رو ...
من الان میدونم باید چیکار کنم ...باید در پاسخ BROADCAST بشینم listen کنم . اما آیا گوش دادن به پورت tcp بدون Accept کردن اون برنامه که داده ها رو برادکست کرده امکان داره ؟

FastCode
چهارشنبه 28 فروردین 1392, 18:10 عصر
خوب از اونا چه نتیجه ای دستگیر من میشه ؟ من با WIRESHARK زدم تست رو ...
من الان میدونم باید چیکار کنم ...باید در پاسخ BROADCAST بشینم listen کنم . اما آیا گوش دادن به پورت tcp بدون Accept کردن اون برنامه که داده ها رو برادکست کرده امکان داره ؟
چرا نداشته باشه؟
اگر Listen کنی که چیزی دریافت نمیکنی.چون برنامه اصلی دیگه نمیتونه Listen کنه.

FastCode
چهارشنبه 28 فروردین 1392, 18:18 عصر
راجع به Port punching تحقیق کن.