PDA

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



Programmer 1
پنج شنبه 26 خرداد 1390, 00:52 صبح
سلام دوستان ،

مشکل این کد چیه ، اجرا میشه ولی اون چیزی نیست که من میخوام


public partial class Server : Form
{
public Server()
{
InitializeComponent();
}

static byte[] data = new byte[2048];
static Socket newSocket;

private void txtSend_Click(object sender, EventArgs e)
{
newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,

ProtocolType.Tcp);
newSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000));

ThreadStart ts = new ThreadStart(Listen);
Thread t = new Thread(ts);
t.Start();
txtSendAndRecievedMessage.Text = "Client: " + Encoding.ASCII.GetString(data);
}

static private void Listen()
{

newSocket.Listen(10);
Socket acceptedSocket = newSocket.Accept();
acceptedSocket.Receive(data);
}
}


من چون از سوکت های سنکرون برای ارتباط استفاده کردم برنامه سمت سرور تا زمانی که یک سوکت رو نپذیرفته هنگ میکنه و نمیشه هیچ کاری باهاش کرد ، میدونم که باید از سوکت های آسنکرون در سیستمهای مالتی تسک مثل ویندوز استفاده کرد ولی خوب من اومدم یک کاری کردم برای رفع این مشکل:
اومدم اون بخشی که باعث هنگ برنامه میشه (جایی که سوکت در حال گوش دادن هست) رو داخل یک متد گذاشتم و در یک ترید (thread) اجراش کردم ولی وقتی Trace گرفتم اصلا متد listen که باید توسط
ترید اجرا بشه ، اجرا نمیشه! و مستقیما میره خط بعدی دستورات .
بعد یک سوال ، دیگه اساسا سوکتهای سنکرون تو کجا کاربرد دارن؟!

لطفا راهنمایی کنید.

saman6384
پنج شنبه 26 خرداد 1390, 10:47 صبح
وقتی به accept میرسه منتظر میمونه!
شما تو listen فقط داری میگی از تو صف 10 تا رو قبول کنه!
در ضمن bind و listen رو لازم نیس تو ترد جدا بزاری! فقط accept و recieve رو بزاری کافیه!

Programmer 1
پنج شنبه 26 خرداد 1390, 12:42 عصر
شما تو listen فقط داری میگی از تو صف 10 تا رو قبول کنه!
پس در واقع listen می آد 10 تا رو Accept میکنه و تو بافر قرار می ده و بعدش با Accept یکی از تو بافر انتخاب میکنیم .

ولی بازم مشکل حل نشد ، هدفم اینه که وقتی دکمه Send رو زدیم برنامه کلا هنگ نکنه و بشه مثلا فرم رو جابه جا کرد و اونم تو ترید فقط به سوکتها گوش بده همین . ببینید میتونید این مشل رو حل کنید . کدش رو ضمیمه کردم (با VS2010 نوشتم) .

با تشکر/.

Programmer 1
پنج شنبه 26 خرداد 1390, 22:41 عصر
لطفا یکی از دوستان مشکل این کد رو برطرف کنه ، بدجوری توش موندم

Programmer 1
جمعه 27 خرداد 1390, 10:17 صبح
کسی نیست جواب بده؟

saman6384
جمعه 27 خرداد 1390, 11:20 صبح
پس در واقع listen می آد 10 تا رو Accept میکنه و تو بافر قرار می ده و بعدش با Accept یکی از تو بافر انتخاب میکنیم .

ولی بازم مشکل حل نشد ، هدفم اینه که وقتی دکمه Send رو زدیم برنامه کلا هنگ نکنه و بشه مثلا فرم رو جابه جا کرد و اونم تو ترید فقط به سوکتها گوش بده همین . ببینید میتونید این مشل رو حل کنید . کدش رو ضمیمه کردم (با VS2010 نوشتم) .

با تشکر/.

اول : من جوابتونو ندیده بودم که جواب بدم
شرمنده

دوم : نه عزیز!!!
اینو بخون شاید من دارم بد توضیح میدم! لینک (http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.listen.aspx)
تابع listen هیچ چیزی رو دریافت نمیکنه!! فقط تعداد صف ورودی رو میگیره!

تابعی که درخواسها رو میگیره Accept (http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.accept.aspx)هستش

سوم : باشه نگاه میکنم

saman6384
جمعه 27 خرداد 1390, 11:41 صبح
برنامتون تقریبا میشه گفت هیچ کاری نمیتونه بکنه!!

شما یه نگاهی به این جزوه بنداز! لینک (http://www.persianupload.com/7291677)

کدت رو اینجوری تغییر دادم : حالا 10 تا کلاینت قبول میکنه بعد منتظر میشه یه پیغامی بدن ( مثلا اسمه کلاینت یا پیغام سلام) بعد خودشم واسش یه پیغام خوشامدید میفرسته!
بعد دوباره منتظر میشه تا یه کلاینت جدید بهش وصل بشه!

static byte[] data = new byte[2048];
static Socket newSocket;
int clientqueue = 10;
Socket[] Client;

private void txtSend_Click(object sender, EventArgs e)
{
newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
newSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000));
newSocket.Listen(clientqueue);
ThreadStart ts = new ThreadStart(Listen);
Thread t = new Thread(ts);
t.Start();

}

private void Listen()
{
for (int i = 0; i < clientqueue; i++)
{
Client[i] = newSocket.Accept();
Client[i].Receive(data);
txtSendAndRecievedMessage.Invoke((MethodInvoker)de legate { txtSendAndRecievedMessage.Text = "Client: " + Encoding.ASCII.GetString(data); });
Client[i].Send(System.Text.Encoding.ASCII.GetBytes("Welcome"),SocketFlags.None);
}

}