fazel-d
سه شنبه 26 آذر 1387, 21:02 عصر
1 -
داخل یه برنامه سوکت _ برای اینکه سرور همیشه Listen باشد متد Receive رو داخل یه BGWorker و در داخل آن یه حلقه while قرار دادم _ و وقتی که می خواهم اطلاعات دریافتی از Client رو در TextBox موجود بر روی Server نشان دهم _ یه Error مبنی براین که از TextBox در این Thread نمی توانید استفاده کنید داد که من برای اینکه دیگه این مشکل پیش نیاد از Delegate ها استفاده کردم و اون TextBox رو Invoke کردم _ اما باز هم به من Error داد
البته این کار رو با Thread هم کردم و به همین مشکل برخوردم
همچنین متد AsynCallBack هم استفاده کردم و زمانی که Client برای اولین بار اطلاعاتشو برای Server می فرسته توی اون TextBox نشون می ده ولی برای دفعات بعدی نه ! اگرچه از یه WHile هم استفاده کردم
بنابراین ترجیح دادم که از همون BGWorker استفاده کنم .
خواهشا جوابها بر روی BGWorker باشه _ چونکه خیلی کد زدم و تغییرشون :عصبانی++:
این هم کد :
private void Form1_Load(object sender, EventArgs e)
{
bgWorkerServer.RunWorkerAsync();
//RunServer();
}
private void bgWorkerServer_DoWork(object sender, DoWorkEventArgs e)
{
RunServer();
}
private void RunServer()
{
try
{
server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
ipServer = new IPEndPoint(ipAdrServer, PortNum);
server.Bind(ipServer);
lbstatus.Text="Waiting for Client ... ";
server.Listen(100);
server = server.Accept();
IPEndPoint ipClient=(IPEndPoint)server.RemoteEndPoint;
lbstatus.Text = string.Format("{0}:{1}",ipClient.Address,ipClient.Port);
textBox txt1 = new textBox(RunServer);
if (txtReceive.InvokeRequired)
{
txtReceive.Invoke(txt1);
return;
}
while (true)
{
buffer = new byte[500];
int numRec= server.Receive(buffer, SocketFlags.None);
strBuf = Encoding.ASCII.GetString(buffer, 0, numRec);
lbstatus.Text = "Received Data From Client . ";
MessageBox.Show(strBuf);
MessageBox.Show(numRec.ToString());
txtReceive.Text = strBuf;
}
}
catch (SocketException Ex)
{
MessageBox.Show(Ex.ToString());
}
}
#endregionفکر نکنم توی کد مشکلی باشه _ چونکه من خودم با همین تعریف ها در Delegate برنامه های دیگه ای هم نوشتم.
2 -
البته یه مشکل دیگه هم هست و اون زمانی هست که از متد Bind داخل Thread که استفاده می کنم خطای زیر رو می ده
Only one usage of each Socket address .....
داخل یه برنامه سوکت _ برای اینکه سرور همیشه Listen باشد متد Receive رو داخل یه BGWorker و در داخل آن یه حلقه while قرار دادم _ و وقتی که می خواهم اطلاعات دریافتی از Client رو در TextBox موجود بر روی Server نشان دهم _ یه Error مبنی براین که از TextBox در این Thread نمی توانید استفاده کنید داد که من برای اینکه دیگه این مشکل پیش نیاد از Delegate ها استفاده کردم و اون TextBox رو Invoke کردم _ اما باز هم به من Error داد
البته این کار رو با Thread هم کردم و به همین مشکل برخوردم
همچنین متد AsynCallBack هم استفاده کردم و زمانی که Client برای اولین بار اطلاعاتشو برای Server می فرسته توی اون TextBox نشون می ده ولی برای دفعات بعدی نه ! اگرچه از یه WHile هم استفاده کردم
بنابراین ترجیح دادم که از همون BGWorker استفاده کنم .
خواهشا جوابها بر روی BGWorker باشه _ چونکه خیلی کد زدم و تغییرشون :عصبانی++:
این هم کد :
private void Form1_Load(object sender, EventArgs e)
{
bgWorkerServer.RunWorkerAsync();
//RunServer();
}
private void bgWorkerServer_DoWork(object sender, DoWorkEventArgs e)
{
RunServer();
}
private void RunServer()
{
try
{
server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
ipServer = new IPEndPoint(ipAdrServer, PortNum);
server.Bind(ipServer);
lbstatus.Text="Waiting for Client ... ";
server.Listen(100);
server = server.Accept();
IPEndPoint ipClient=(IPEndPoint)server.RemoteEndPoint;
lbstatus.Text = string.Format("{0}:{1}",ipClient.Address,ipClient.Port);
textBox txt1 = new textBox(RunServer);
if (txtReceive.InvokeRequired)
{
txtReceive.Invoke(txt1);
return;
}
while (true)
{
buffer = new byte[500];
int numRec= server.Receive(buffer, SocketFlags.None);
strBuf = Encoding.ASCII.GetString(buffer, 0, numRec);
lbstatus.Text = "Received Data From Client . ";
MessageBox.Show(strBuf);
MessageBox.Show(numRec.ToString());
txtReceive.Text = strBuf;
}
}
catch (SocketException Ex)
{
MessageBox.Show(Ex.ToString());
}
}
#endregionفکر نکنم توی کد مشکلی باشه _ چونکه من خودم با همین تعریف ها در Delegate برنامه های دیگه ای هم نوشتم.
2 -
البته یه مشکل دیگه هم هست و اون زمانی هست که از متد Bind داخل Thread که استفاده می کنم خطای زیر رو می ده
Only one usage of each Socket address .....