PDA

View Full Version : سوال: پیام اتصال در برنامه ارسال پیام در LAN



amir-aa
سه شنبه 04 دی 1397, 09:42 صبح
سلام و عرض ادب
من یک برنامه نوشتم برای اتصال دو تا رایانه بهم که بتونن بهم توی LAN پیام بفرستن خیلی ساده و بدون وجود سرور . اما دوطرف بایستی connect کنند تا بتونن پیام بفرستن. کامپیوتر اول آی پی و پورت مقصد رو انتخاب کنه و کامپیوتر دوم آی پی و پورت مورد استفاده رایانه اول رو وارد کنه تا بتونن باهم ارتباط بگیرن. میخوام ببینم راهی هست که بتونم کاری کنم که هر موقع رایانه اول خواست ارتباط بگیره روی رایانه دوم پیام بیاد که رایانه ای با این پورت و این آدرس آی پی قصد اتصال داره؟
خودم برای اینکار یک ارتباط ثانویه ایجاد کردم روی یک پورت مشخص مثلا 21 و گفتم با بازشدن برنامه روی پورت 21 با 0.0.0.0 اتصال بگیره که خب منطقی نبود که درست کار کنه و همینطور هم شد ارور داد. بفکر تایمر هم افتادم که دائما پورت مشخصی رو چک کنه اما خب بازهم نمی شد باید مقصد برای هر دو کامپیوتر دقیق مشخص می شد. قطعا یک راهکاری داره ولی من سرچ کردم پیدا نکردم البته در حالتی که یک سرور در میان باشه میشه اما end To end راهی براش ندیدم. بی زحمت اگر کسی میدونه بهم بگه.

hamid_hr
سه شنبه 04 دی 1397, 10:01 صبح
باید یک پکیج آماده باش برای تمام سیستم ها(Broadcast) بر روی یک پورت udp ارسال کنید که من آماده ام. کامپیوتری که این پیام رو دریافت کرد بیاد اتصال رو برقرار کنه و ادامه کار
برای ارسال یک Broadcast از این راهنما استفاده کنید
public void Send() { UdpClient client = new UdpClient();
IPEndPoint ip = new IPEndPoint(IPAddress.Broadcast, 15000);
byte[] bytes = Encoding.ASCII.GetBytes("Hiii");
client.Send(bytes, bytes.Length, ip);
client.Close();
}

amir-aa
سه شنبه 04 دی 1397, 10:17 صبح
باید یک پکیج آماده باش برای تمام سیستم ها(Broadcast) بر روی یک پورت udp ارسال کنید که من آماده ام. کامپیوتری که این پیام رو دریافت کرد بیاد اتصال رو برقرار کنه و ادامه کار
برای ارسال یک Broadcast از این راهنما استفاده کنید
public void Send() { UdpClient client = new UdpClient();
IPEndPoint ip = new IPEndPoint(IPAddress.Broadcast, 15000);
byte[] bytes = Encoding.ASCII.GetBytes("Hiii");
client.Send(bytes, bytes.Length, ip);
client.Close();
}

آخه ببینید بالاخره باید
socket.Connect(epremote) و socket.bind(eplocal) اجرا بشه وگرنه درست نمیشه برای اینکار هم نمیشه آی پی Broadcast بدیم ک

hamid_hr
سه شنبه 04 دی 1397, 10:31 صبح
ببینید هر برنامه که اجرا میشه به سوکت 15000 udp گوش کنه و به همه یک پیغام بده من آماده ام. اگخه کسی گوش کرد که جواب میده وگرنه منتظر میشه یکی بهش پیام بده.

amir-aa
سه شنبه 04 دی 1397, 11:05 صبح
ببینید هر برنامه که اجرا میشه به سوکت 15000 udp گوش کنه و به همه یک پیغام بده من آماده ام. اگخه کسی گوش کرد که جواب میده وگرنه منتظر میشه یکی بهش پیام بده.

اگه میشه یک نمونه بذارید من نتونستم اینو پیاده سازی کنم
پیامی که Broadcast میشه باید بتونیم از طرف مقابل bind کنیم و من نتونستم اینکارو کنم

hamid_hr
سه شنبه 04 دی 1397, 12:06 عصر
https://www.codeproject.com/Articles/21398/%2FArticles%2F21398%2FBroadcasting-Using-Socket-Oriented-Approach
اینجا یه نمونه داره

amir-aa
سه شنبه 04 دی 1397, 13:30 عصر
با این ارور مواجه میشم
A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied
وقتی آی پی مقصد وارد میشه و روی دکمه Connect میزنه باید طرف مقابل یک پیغام بگیره و اگر خواست اون هم Connect رو بزنه.
این مال ارسال پیامه :

scka = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
scka.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);


epremote2 = new IPEndPoint(IPAddress.Parse(ipdst.Text), 9050);

// scka.SetSocketOption(SocketOptionLevel.Socket,Sock etOptionName.ReuseAddress, 1);


byte[] bytes = Encoding.ASCII.GetBytes("12");
scka.SendTo(bytes, epremote2);
scka.Send(bytes);




اینم برای دریافت پیامه که با دوتا تایمر درست میشه:


private void timer1_Tick(object sender, EventArgs e)
{

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);

/*
The Socket.Bind method uses the Any field to indicate that a Socket
instance must listen for client activity on all network interfaces.
The Any field is equivalent to 0.0.0.0 in dotted-quad notation.
*/
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
//Associates a Socket with a local endpoint EndPoint ep = (EndPoint)iep;
sock.Bind(iep);

byte[] data = new byte[1024];
EndPoint ep = (EndPoint)iep;
int recv = sock.ReceiveFrom(data, ref ep);// Receive Data

stringData = Encoding.ASCII.GetString(data, 0, recv);

TI = stringData;
sock.Close();
}

private void timer2_Tick(object sender, System.EventArgs e)
{
if (TI == "12")
{
timer2.Interval = 3000;
TI = "0";
stringData = "0";
MessageBox.Show("some body Wants to make a chat with U");
// Process.Start(Application.StartupPath + "\\ALER.exe"); // Run ALER.exe
}
else
{
timer2.Interval = 110;
}

}




چکار کنم بنظرتون؟