PDA

View Full Version : مشکل با سوکت.برنامه ی چت دو طرفه در LAN



ztx4
چهارشنبه 25 اسفند 1389, 00:31 صبح
67549سلام دوستان
من تازه شروع به یادگیری برنامه نویسی سوکت کردم.
به عنوان تمرین دارم یه برنامه ی ساده ی چت می نویسم.

اما مشکلم اینه که پیام اول به درستی ارسال و دریافت می شه اما به محظ دریافت پیام اول این استثنا رخ می ده:

Only one usage of each socket address (protocol/network address/port) is normally permitted

اینم کد برنامه ام:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

using System.Threading;

namespace SocketChatProgram
{
public partial class Form1 : Form
{
static Socket soc;
static IPEndPoint iplocal = new IPEndPoint(IPAddress.Any, 46317);
delegate void SetTextCallback(string text);
Thread threadRecive;
//Thread threadSend = new Thread(send);
public Form1()
{
InitializeComponent();
}

void recive()
{
while (true)
{

soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
soc.Bind(iplocal);
soc.Listen(100);
// lblState.Text = "Listen";
soc = soc.Accept();
byte[] buffer = new byte[500];
soc.Receive(buffer);


string message = Encoding.Unicode.GetString(buffer);
SedText(message);
Thread.Sleep(5);



}
}
private void SedText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.lstMessages.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SedText);
this.Invoke(d, new object[] { text });
}
else
{
this.lstMessages.Items.Add(text);
}
}
void send()
{
//soc.Bind(iplocal);
soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string s = txtmessage.Text;
byte[] message = Encoding.Unicode.GetBytes(s);

soc.Connect(txtIP.Text, 46317);
soc.Send(message);
soc.Close();
lstMessages.Items.Add(Encoding.Unicode.GetString(m essage));
}

private void Form1_Load(object sender, EventArgs e)
{

}

private void btnConnect_Click(object sender, EventArgs e)
{
//threadRecive.Start();

threadRecive = new Thread(recive);
threadRecive.Start();

btnConnect.Enabled = false;
txtIP.Enabled = false;

}

private void btnSend_Click(object sender, EventArgs e)
{
send();
}

private void txtmessage_TextChanged(object sender, EventArgs e)
{
if (txtmessage.Text.Length == 0)
btnSend.Enabled = false;
else
btnSend.Enabled = true;
}


}
}


خود پروژه رو هم Attach می کنم.

ممنون از راهنمایی شما.
67542

amatur_barnamenevis
چهارشنبه 25 اسفند 1389, 01:08 صبح
سلام.منم دارم تازه برنامه نويسي سوكت رو شروع مي كنم نياز به يكسري مطالب آموزشي دارم .شما كتابي سراغ داريد كه توضيح داده باشه؟؟؟
خودتون چطوري شروع كرديد.
من دنبال يكسري مطالب آموزشي ميگردم
امكانش هست كمكم كنيد؟؟؟

ztx4
چهارشنبه 25 اسفند 1389, 01:44 صبح
سلام
برادر می بینی که من خودم محتاجم به دعا.

منم تازه شروع کردم به این تاپیک (http://barnamenevis.org/showthread.php?121111-TCP-IP-Socket-Programming-in-Framework.Net-2.0&p=587961&viewfull=1#post587961) سر بزنید.توی سایت هم جستجو کنید به چیزهایی می رسید که برای شروع خوبند.

sds1920
چهارشنبه 25 اسفند 1389, 12:28 عصر
دوست عزيز من يه نگاه گذرا كردم ديدم شما يه مشكل اساسي داري اونم اينه:
soc = soc.Accept();
شما چرا سوكت اصلي خودت رو از بين مي بري؟:متعجب:
شما بايد براي هر كاربري كه به برنامه شما متصل مي شه يك سوكت مجزا ايجاد كني علاوه بر سوكتي كه در ابتدا ساختي.
سوكت اول يا همون soc به اين درد ميخوره كه برنامه شما آماده دريافت اتصال باشه و زماني كه اتصال برقرا شد براي ادامه كار بايد يك سوكت جديد بسازيد.ميتونيد اينطوري اصلاحش كنيد:

Socket UserSoc = soc.Accept();
byte[] buffer = new byte[500];
UserSoc .Receive(buffer);
.
.
.
.
.

موفق باشيد

ztx4
چهارشنبه 25 اسفند 1389, 16:04 عصر
دوست گرامی
ممنون از راهنمایی شما.
من تابع Recive رو به این شکل تغییر دادم:


void recive()
{


soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
soc.Bind(iplocal);
soc.Listen(100);

// lblState.Text = "Listen";
while (true)
{



Socket UserSoc = soc.Accept();
byte[] buffer = new byte[500];
UserSoc.Receive(buffer);
// soc = soc.Accept();
// byte[] buffer = new byte[500];
// soc.Receive(buffer);
//soc.Close();
//soc.Dispose();

string message = Encoding.Unicode.GetString(buffer);
SetText(message);
//Thread.Sleep(5);
}



}

اما قسمت قرمز یک استثنا تولید می کنه:

Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.