fmo_82

سلسلة دروس C# Network Programming

237 ردود في هذا الموضوع

اخي الفاضل الحبيب والله انا باقوى تفاعل واتمنى ان تضع الدرس المتعلق بالتحكم اذا امكن ذلك وبكل الاحوال فالامر اليك اولا واخيرا ولكن نحن نحب نتعلم وجزاك الله خير الجزاء

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

د. فــــــــــــــــــــــــادي

سؤال ورأجو الافاده في اقرب وقت وضروريه اذا تكرمت

نزلت الصوت من الفصل 11 وكان املي اضيف للمشروع بعد تجهيز الشبكة

تم ضفتهن للشبكة للاسف ما تم أرسال الصوت وما ادري وين المشكله

رغم حولت زر فقط في الكلاينت انه يستقبل الصوت والسيرفر يرسل الصوت

ارجو تبين الحل واذا تريدني ارسلا لملف برفقه لكن اتمتى في اقرب فرصه جداااااا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

هل تقصد المثال الذي يستخدم الـ Multicast في عملية الإرسال , إذا كان هو فقم بإغلاق الـFirewall بشكل مؤقت لأنه في كثير من الأحيان يغلق الـ Firewallالإتصال كــMulticast وايضا قم بتجربته على نفس الجهاز بشكل بمدئي فإذا انعكس الصوت عندها فالبرنامج يعمل بشكل جيد , جرب المثال الذي يعمل كـ Unicast UDP وتأكد ايضا من اعدادات المايكروفون وانه يسجل الصوت وإذا لم تنجح هذه الأمور اؤجو ارفاق البرنامج

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ارجو عدم المناداه بلألقاب والإكتفاء بلأخ فادي إذ لم احصل على الدكتوراه بعد ;)

يوجد في البرنامج الكثير من الأخطاء

private void Form1_Load(object sender, System.EventArgs e)
{
Tload=new Thread(new ThreadStart(FindHost));
Tload.IsBackground=true;
Tload.Start();
}
public void FindHost()
{
try
{
iep2=new IPEndPoint (IPAddress.Parse("224.100.0.1"),12355);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
iep1=new IPEndPoint(IPAddress.Any,12355);

socket.Bind(iep1);

socket.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.AddMembership,
new MulticastOption(IPAddress.Parse("224.100.0.1")));

}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}

اولا لايمكن عمل الـBind على الـIP Multicast

ثانيا ما الهدف من وضع عملية التعاريف ضمن ميثود وتشغيلها على Thread هذا الأمر خاطيء وغير مبرر الصحيح أن يتم وضع الـInstallation ضمن الـConstructor للـ Class أو عند تشغيها في الـButton

وتكرر نفس الخطأ ايضا في برنامج الزبون

		public void ConnectToServer()
{
try
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(iep2);
socket.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.AddMembership,
new MulticastOption(IPAddress.Parse("224.100.0.1")));

thread = new Thread(new ThreadStart(Voice_In));
button1.Enabled=false;
button3.Enabled=true;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void button1_Click(object sender, System.EventArgs e)
{
Tconnect=new Thread(new ThreadStart(ConnectToServer));
Tconnect.IsBackground=true;
Tconnect.Start();
}

ارجو قراءة التالي لإستخدام الـThreading في برمجيات الشبكات (من كتاب احترف برمجة الشبكات الفصل العشرون):

استخدام الـ Multithreading في برمجيات الشبكات:

ينصح باستخدام الـ Multithreading في برمجيات الشبكات التي تعتمد البرمجة المتزامنة Synchronous Programming إذ أن طبيعة التنفيذ في هذه البرمجيات متسلسلة وهو ما سوف يمنع من تنفيذ عمليات أخرى لحين الانتهاء من العملية الجارية ، إذ أنه ومن المفضل استخدام Thread منفصل لكل عملية قد تطرنا إلى الانتظار فترة طويلة أو أن العملية ستبقى في وضع التنفيذ طيلة فترة تشغيل البرنامج.

1- استخدام الـ Threading في برمجيات الزبون Clients :

- استخدام دالة الربط Connect في الاتصال المتزامن: في حالة استخدام الـ Connect Method وفي حالة كان الـServer بطيء فإن عملية الموافقة ستأخذ بعض الوقت مما يؤدي إلى توقف البرنامج عن الاستجابة لحين إتمام عملية القبول ويفضل في هذه الحالة استخدام Thread منفصل للقيام بعملية الاتصال.

- استخدام الـ Client في عملية الإرسال و الاستقبال المتزامن ، يفضل في حالة الإرسال المتزامن عدم استخدام Thread منفصل لكل عملية وخاصة إذا كان الهدف من البرنامج إرسال مجموعة من التعليمات المختلفة إلى نفس الـServer حيث سيكون منشغل باستقبال التعليمات التي تم يتم إرسالها ، ويفضل في هذه الحالة استخدام البرمجة غير المتزامنة إذا كان الإرسال لأكثر من تعليمة ولنفس الجهة، أما في حالة الاستقبال المتزامن فلا بد من استخدام الـThread لأن عدم استخدام الـ Thread سيؤدي إلى توقف البرنامج عن الاستجابة.

2- استخدام الـ Threading في برمجيات الخادم Server :

- استخدام دالة القبول AcceptSocket ، لابد من استخدام Thread منفصل في حالة استخدام دالة القبول AcceptSocket في البرمجة المتزامنة إذ انه سيتوقف البرنامج عن الإستجابة في حالة عدم استخدام الـ Thread مع الـ AcceptSocket حيث توضع عادة في Infinity Loop.

حالة خاصة:

قد تضطر إلى اللجوء إلى البرمجة غير المتزامنة في حالة إذا كان الـ Server سيستقبل أكثر من Client Reqouest في نفس الوقت مما سيؤدي إلى قبول أول طلب ورفض البقية وهذا امر غير فعال وخاصة إذا كان البرنامج سيعمل على الإنترنت وأن عدد الـ Clients وأوقات دخولهم غير معروفة ، وفي هذه الحالة لابد من الجوء إلى البرمجة غير المتزامنة asynchronous Programming لإتمام عملية القبول.

واهلا وسهلا بك

تم تعديل بواسطه fmo_82
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أولا شكر أخ فادي

لكن برنامج (peer 1 , peer 2) ما اشتغل على جهازي ولا انعكس الصوت ولا حتى على الشبكة .

طيب برايك وش الحل ؟؟

أنا ترك الصوت اخر شي في مشروعي على اساس انه يعمل صحيح وفاضل لي 5 أيام على تسليم المشروع ارجو المساعده لاني في أمس الحاجه للبرنامج الصوت لارسال الى اكثر من كلاينت

أرجو المساعده توكلي على الله ثم عليك

ما عندي الا برنامج المنزل من الفصل 11 ما عندي (unicast) أرجو مساعد اخ فادي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

الفصل السابق يحتوي على مثالين الأول يستخدم الـVOIP Chat Using Unmanaged API Functions

والثاني يستخدم DirectX - DirectPlay Transport Protocol

وقد قمت بتجربة المثالين وعبر الشبكة وعمل لدي بدون مشاكل , على أي حال فإن استخدام الـUDP Multicast في المثال الأول يوجد به الكثير من المشاكل منها تقطيع في الصوت وهذا طبيعي لطبيعة الإرسال في الـMulticast , انصحك باستخدام المثال الثاني الذي يعتمد على الـDirect Play في حالة الـConferencing واستخدام المثال الأول فقط في حالة الإتصال كـ Peer to Peer ,

ارجو ارفاق كود البرنامج الذي لا يعمل لديك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

أستاذي الفاضل

ممكن ترفق لي البرنامج لاني اخذ من زمان برنامج Conferencing نفته على جهازي ولم يوجد سيرفر ما فهمت كيف وتركته . ارجو منك ارفاق برنامج الصوت الذي جربته وراح انفذه مباشره على شبكة

ارجو منك المساعده ولك كل الشكر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله وبركاته

اخ فادي هل من الممكن ان تضيف المثال الخاص بالتحكم في سطح المكتب لانني مهتم به جدا ولا ادري كيف اجعل الاعضاء متفاعلين فها انا والاخ الجو روعة متفاعلين اما البقية فماذا نفعل لهم فاذا امكن اضافة الملف الخاص بالتحكم في سطح المكتب البعيد فسوف تساعدنا كثيرا وجزاك الله خير الجزاء

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم اخي ابو حفص , تم إضافة الدرس على الرابط:

http://www.fadidotnet.org/online_book/Netw...ming_online.htm

http://www.fadidotnet.org/online_book/Remote_Control.htm

وتستطيع الإستفسار عن أي موضوع حوله

واهلا وسهلا بك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بارك الله فيك ورضي عنك اخي الكريم وجزاك الله خير الجزاء ووالله انني مستحي من كثر ما اثقلت عليك بالطلبات .

رضي الله عنك اخي الفاضل واشكرك جزيل الشكر.

ولي عودة ان شاء الله بعد ما اقراء الدرس وتسلملي اخ فادي.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم

احببت ان اضيف جزء من فصل برمجة امن الشبكات إلى المنتدى ولكي يساهم بإذن الله برفع مستوى اخوننا المبرمجين في مجال امن الشبكات وخاصة ما يتعلق بطرق تأمين الإتصال الصوتي عبر الإنترنت وغيره ...

أولا: RSACryptoServiceProvider:

ويستخدم في إجراء التشفير وفك التشفير الغير متماثل وهو non inherited Class في البداية سوف ننشئ instance جديد من الـRSACryptoServiceProvider وذلك لتوليد المفتاح العام والخاص ونرفق المفتاح العام مع الرسالة ومن ثم يقوم المستلم بفك الرسالة باستخدام المفتاح الخاص لاحظ الشكل التالي:

RSA1.JPG

ولتطبيق إنشاء مشروع تشفير وفك تشفير يستخدم طريقة الـRSA Algorithm , سنقوم بالبداية بإنشاء Tow Methods الأولى نمرر لها الـString Plain Message والـPrivateKay وذلك لتشفير الرسالة بناءا عليه ، وأخرى لفك التشفير ونمرر لها الرسالة المشفرة كـ Byte Array والمفتاح الخاص كـString ، وسنستخدم الـRSACryptoServiceProvider Class لتشفير الرسالة باستخدام الـ RSA Algorithms ، ونمرر له الـ Private Kay كـ CspParameters Object وباستخدام الـ Encrypt Method والـ DecryptMethod ضمن الـ الـRSACryptoServiceProvider Class نتمم عملية التشفير وفك التشفير ونمرر لها الرسالة المراد تشفيرها أو فك تشفيرها بالإضافة إلى قيمة True أو False لتفعيل طريقة التشفير كـFOAEP ويدعم هذا الأسلوب إصدارات الـ Windows XP وما بعدها ، لذلك يفضل اختيار False دائما ولضمان التوافقية مع الإصدارات الأقدم من نظام التشغيل ...

C#:

public byte[] Encrypt(string strData,CspParameters PrivateKey)

{

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(PrivateKey);

byte[] data = rsa.Encrypt(Encoding.Unicode.GetBytes(strData), false);

return data;

}



public byte[] Decrypt(byte[] en_data,CspParameters PrivateKey)

{

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(PrivateKey);

byte[] data = rsa.Decrypt(en_data, false);

return data;

}



VB.NET:

Public Function Encrypt(ByVal strData As String, ByVal PrivateKey As CspParameters) As Byte()

Dim rsa As RSACryptoServiceProvider = New RSACryptoServiceProvider(PrivateKey)

Dim data As Byte() = rsa.Encrypt(Encoding.Unicode.GetBytes(strData), False)

Return data

End Function



Public Function Decrypt(ByVal en_data As Byte(), ByVal PrivateKey As CspParameters) As Byte()

Dim rsa As RSACryptoServiceProvider = New RSACryptoServiceProvider(PrivateKey)

Dim data As Byte() = rsa.Decrypt(en_data, False)

Return data

End Function

ولاستخدام الـ Methods السابقة يجب أولا إنشاء Instance Object من الـ CspParameters Class قم نمرر المفتاح العام إلى الـ KeyContainerName Proparity ضمن الـ Instance Object الخاص بالـCspParameters Class وكما يلي:

C#:

public byte[] mymsg;



Try //لتشفير

{

CspParameters cp = new CspParameters();

cp.KeyContainerName = text_private.Text;



mymsg = Encrypt(text_msg_to_send.Text,cp);

text_encrypted.Text = Encoding.Unicode.GetString(mymsg);

}

catch (Exception ex){MessageBox.Show(ex.Message);}





try//لفك التشفير

{

CspParameters cp = new CspParameters();

cp.KeyContainerName = text_private1.Text;



byte[] my_msg = Decrypt(mymsg,cp);

text_decrypted.Text = Encoding.Unicode.GetString(my_msg);

}

catch (Exception ex){MessageBox.Show(ex.Message);}



VB.NET:

Public mymsg As Byte()



Try 'لتشفير

Dim cp As CspParameters = New CspParameters

cp.KeyContainerName = text_private.Text



mymsg = Encrypt(text_msg_to_send.Text,cp)

text_encrypted.Text = Encoding.Unicode.GetString(mymsg)

Catch ex As Exception

MessageBox.Show(ex.Message)

End Try



Try ' لفك التشفير

Dim cp As CspParameters = New CspParameters

cp.KeyContainerName = text_private1.Text



Dim my_msg As Byte() = Decrypt(mymsg, cp)

text_decrypted.Text = Encoding.Unicode.GetString(my_msg)

Catch ex As Exception

MessageBox.Show(ex.Message)

End Try

في برمجيات الشبكات نقوم في البداية بتشفير البيانات المرسلة باستخدام أي من الأساليب السابقة لتشفير ثم نحول البيانات المشفرة إلى Stream لإرسالها عبر الـSocket باستخدام الـNetwork Stream كمثال، ثم يقوم الطرف المستقبل باستقبال الرسالة باستخدام الـNetwork Stream عبر الـSocket ،ويجب أن تكون عملية فك التشفير كما هي الخوارزمية المستخدمة إثناء التشفير سواء RSA أو DES أو التواقيع الرقمية ، ثم نستطيع تحمل الرسالة إلى الـMemory stream حيث ستستقبل الرسالة كـStream Data ، وبعد ذلك يمكن تحويلها إلى Byte Array لفك تشفيرها لتحويلها إلى رسالة مرة أخرى، لاحظ الشكل التالي:

RSA2.JPG

سنقوم الآن بإنشاء برنامج بسيط (Client / Server) لإرسال نص من جهاز إلى آخر وسنخدم فيه الـ RSA لتشفير النص المرسل حيث سيتفق الطرفان على الـ Private Kay والذي سيستخدم لتشفير و فك تشفير الرسالة...

و سيكون الشكل العام للبرنامج كما في الشكل التالي ويبين طرفان مرسل ومستقبل ويقوم المرسل بتشفير الرسالة باستخدام المفتاح العام ويتفق الطرفان على المفتاح الخاص والذي سيتم فك الرسالة من خلاله:

RSA%20_Chat.jpg

أولا المرسل أو الـ Client :

وسنستخدم فيه الطريقة المعروفة لتشفير الرسائل باستخدام الـ RSA algorithms حيث سيتم تحويل الرسالة المشفرة إلى Byte Array وسنستخدم الـ Serialization لإرسالها حيث سيتم إرسالها كـ Serialization Object ويتم كل ذلك كما يلي:

C#:

using System.Text;

using System.Security.Cryptography;

using System.Net.Sockets;

using System.Net;

using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

.

.

.

public byte[] mymsg;

public byte[] Encrypt(string strData,CspParameters PrivateKey)

{

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(PrivateKey);

byte[] data = rsa.Encrypt(Encoding.Unicode.GetBytes(strData), false);

return data;

}

.

.

.

try

{

CspParameters cp = new CspParameters();

cp.KeyContainerName = text_private.Text;

mymsg = Encrypt(text_msg_to_send.Text,cp);

text_encrypted.Text = Encoding.Unicode.GetString(mymsg);



object op = (object) mymsg;



BinaryFormatter br = new BinaryFormatter ();



TcpClient myclient = new TcpClient (text_IP.Text,7000);

NetworkStream myns = myclient.GetStream ();

br.Serialize (myns,op);



myns.Close ();

myclient.Close ();



}

catch (Exception ex){MessageBox.Show(ex.Message);}



VB.NET:

Imports System.Text

Imports System.Security.Cryptography

Imports System.Net.Sockets

Imports System.Net

Imports System.IO

Imports System.Runtime.Serialization.Formatters.Binary

.

.

.

Public mymsg As Byte()

Public Function Encrypt(ByVal strData As String, ByVal PrivateKey As CspParameters) As Byte()

Dim rsa As RSACryptoServiceProvider = New RSACryptoServiceProvider(PrivateKey)

Dim data As Byte() = rsa.Encrypt(Encoding.Unicode.GetBytes(strData), False)

Return data

End Function

.

.

.

Try

Dim cp As CspParameters = New CspParameters

cp.KeyContainerName = text_private.Text

mymsg = Encrypt(text_msg_to_send.Text,cp)

text_encrypted.Text = Encoding.Unicode.GetString(mymsg)



Dim op As Object = CObj(mymsg)

Dim br As BinaryFormatter = New BinaryFormatter

Dim myclient As TcpClient = New TcpClient(text_IP.Text, 7000)

Dim myns As NetworkStream = myclient.GetStream()

br.Serialize (myns,op)



myns.Close ()

myclient.Close ()



Catch ex As Exception

MessageBox.Show(ex.Message)

End Try

ثانيا المستقبل أو الـ Server :

وفي طرف المستقبل الـ Server يتم استقبال الـ Encrypted Message as an Object ثم تحول إلى Byte Array بعد عمل الـ Casting عليها ومن ثم نمرر الـ Byte Array المستلم إلى الـ RSA Decryption Method ليتم فك تشفيرها باستخدام المفتاح الخاص والذي تم الاتفاق عليه ...

C#:

using System.Text;

using System.Security.Cryptography;

using System.Net.Sockets;

using System.IO;

using System.Threading;

using System.Runtime.Serialization.Formatters.Binary;

using System.Runtime.Serialization.Formatters;

.

.

.

public byte[] mymsg;

NetworkStream myns;

TcpListener mytcpl;

Socket mysocket;

Thread myth;



public byte[] Decrypt(byte[] en_data,CspParameters PrivateKey)

{

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(PrivateKey);

byte[] data = rsa.Decrypt(en_data, false);

return data;

}

.

.

.

void RSA_Server ()//استقبال الرسالة بشكل مشفر

{

mytcpl = new TcpListener (7000);

mytcpl.Start ();

mysocket = mytcpl.AcceptSocket ();

myns = new NetworkStream (mysocket);

BinaryFormatter br = new BinaryFormatter ();

object op;

op= br.Deserialize (myns); // Deserialize the Object from Stream



mymsg = (byte[]) op;

text_encrypted.Text = Encoding.Unicode.GetString(mymsg);



mytcpl.Stop();



while (true)

{

RSA_Server();

}

}

.

.

.



try // فك تشفير الرسالة

{



CspParameters cp = new CspParameters();

cp.KeyContainerName = text_private1.Text;



byte[] my_msg = Decrypt(mymsg,cp);

text_decrypted.Text = Encoding.Unicode.GetString(my_msg);

}

catch (Exception ex){MessageBox.Show(ex.Message);}



VB.NET:

Imports System.Text

Imports System.Security.Cryptography

Imports System.Net.Sockets

Imports System.IO

Imports System.Threading

Imports System.Runtime.Serialization.Formatters.Binary

Imports System.Runtime.Serialization.Formatters

.

.

.

Public mymsg As Byte()

Private myns As NetworkStream

Private mytcpl As TcpListener

Private mysocket As Socket

Private myth As Thread



Public Function Decrypt(ByVal en_data As Byte(), ByVal PrivateKey As CspParameters) As Byte()

Dim rsa As RSACryptoServiceProvider = New RSACryptoServiceProvider(PrivateKey)

Dim data As Byte() = rsa.Decrypt(en_data, False)

Return data

End Function

.

.

.



Private Sub RSA_Server() ' استقبال الرسالة بشكل مشفر

mytcpl = New TcpListener(7000)

mytcpl.Start()

mysocket = mytcpl.AcceptSocket()

myns = New NetworkStream(mysocket)

Dim br As BinaryFormatter = New BinaryFormatter

Dim op As Object

op = br.Deserialize(myns) ' Deserialize the Object from Stream



mymsg = CType(op, Byte())

text_encrypted.Text = Encoding.Unicode.GetString(mymsg)



mytcpl.Stop()



Do While True

RSA_Server()

Loop

End Sub

.

.

.

Try ' فك تشفير الرسالة



Dim cp As CspParameters = New CspParameters

cp.KeyContainerName = text_private1.Text



Dim my_msg As Byte() = Decrypt(mymsg, cp)

text_decrypted.Text = Encoding.Unicode.GetString(my_msg)

Catch ex As Exception

MessageBox.Show(ex.Message)

End Try

نستطيع من خلال هذا المثال استخدام أسلوب التشفير هذا مع الـVoice Over IP Applications لكن تبقى مشكلة محدوديات الاتصال الصوتي ومتطلباته من أكثر الأمور التي تواجه طرق تشفير الصوت في الإنترنت ومن هنا يجب استخدام الأساليب الخاصة بضغط البيانات الصوتية قبل وبعد عملية التشفير .... جزء من فصل برمجة أمن الشبكات - كتاب احترف برمجة الشبكات والنظم الموزعة

RSA_Chat_System.zip

تم تعديل بواسطه فادي عبدالقادر
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

اخ فادي عندي مشكلة في لستخدام الصوت حيث انني اقوم بتجربة البرنامج الذي قمت بارفاقه عند تشغيل البرنامج على الجهاز المثبت عليه visual studio لا تحصل مشكلة اما عند تشغيل البرنامج على جهاز غير مثبت عليه وعند الضغط على Start Talking فانه يظهر رسالة الخطا التالية

See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.Exception: 6
at Voice.WaveOutHelper.Try(Int32 err)
at Voice.WaveOutPlayer..ctor(Int32 device, WaveFormat format, Int32 bufferSize, Int32 bufferCount, BufferFillEventHandler fillProc)
at Client.VoiceChat.Start() in D:\Documents and Settings\MSM\Desktop\Client\Classes\VoiceChat.cs:line 166
at Client.VoiceChat.StartVoiceChatMe() in D:\Documents and Settings\MSM\Desktop\Client\Classes\VoiceChat.cs:line 88
at Client.FrmChat.button1_Click(Object sender, EventArgs e) in D:\Documents and Settings\MSM\Desktop\Client\Forms\FrmChat.cs:line 71
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
Client
Assembly Version: 1.0.0.0
Win32 Version: 1.0.0.0
CodeBase: file:///C:/Documents%20and%20Settings/Administrator/سطح%20المكتب/Debug/Client.exe
----------------------------------------
System.Windows.Forms
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
Voice
Assembly Version: 1.0.2270.28420
Win32 Version: 1.0.2270.28420
CodeBase: file:///C:/Documents%20and%20Settings/Administrator/سطح%20المكتب/Debug/Voice.DLL
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.

تم تعديل بواسطه oldman
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

يوجد لديك مشكلة في الـFramework , ما هي الـVersion التي تعمل عليها؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اعمل على الاصدارة 2.0

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

يبدو أن هذا الموضوع قد بدأ يفقد اهتمام الأعضاء في المنتدى لكن ومع هذا لابد من أن يعلم الجميع أن هنالك الكثير من المواضيع التي وجب علينا التفكير والبحث بها والتي تستحق الدراسة , الموضوع الذي احببت أن اتحدث عنه اليوم هو Raw Socket Programming

Part From Chapter: Raw Socket Programming in Dot Net

بسم الله الرحمن الرحيم

يعتبر موضوع الـ Raw Socket من المواضيع الهامة وخاصة للبرمجيات التي تعتمد على التعامل مع البروتوكولات في المستوى الأدنى من الـ Transport Layer ومنها بروتوكول الـ ARP والـ RARP والمستخدم بشكل أساسي لجلب الـ MAC أو الـ Physical Address للـ Ethernet Card والـ IGMP المخصص لإدارة المجموعات في الـ Multicasting بالإضافة إلى بروتوكول الـ ICMP والذي يستخدم بشكل أساسي في عملية الـ Ping بالإضافة إلى الكثير من العمليات الأخرى لإرسال حالة الـ Message بعد إرسالها إلى الـ Destination ,ومن المعروف أن الـ ICMP و الـ ARP تصنف من البروتوكولات التي تعمل على مستوى الـNetwork Layer ضمن الـ TCP/IP Model وهذا يعني أنها Connectionless Protocols، و لا تعتمد هذه البروتوكولات على استخدام أي من البروتوكولات في الـTransport Layer إذ لا حاجة لاستخدام الـ Ports عند التعامل معها...

لتعامل مع الـ Raw Socket في الدوت نيت يجب أولا تعريف الـ Raw Socket Type بعد ذلك يمكننا اختيار أي من البروتوكولات التي تعمل على الـ Network Layer وتدعم الـRaw Socket التعامل مع البروتوكولات التالية وكما هو واضح في الجدول:

Protocol Name	Description
GGP Gateway-to-Gateway Protocol
ICMP Internet Control Message Protocol
IGMP Internet Group Management Protocol
IP A raw IP packet
IPX Novell IPX Protocol
ND Net Disk Protocol
PUP Xerox PARC Universal Protocol (PUP)
RAW A raw IP packet
SPX Version 1 & 2 Novell SPX Protocol

وكمثال لبرمجة بروتوكول الـ ICMP يجب أولا تعريف الـ Raw Socket كما يلي:

C#:
Socket raw_socket = new Socket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Icmp);

VB.NET:
Dim raw_socket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp)

ويعتبر بروتوكول الـ ICMP بروتوكول Connectionless وهذا يعني عدم حاجته أيضا لإجراء عملية الـConnect أو الـ Binding مع الـ Socket لذلك نحدد له فقط في الـ IPEndPoint Object الـ IP Address للـ Destination ودون تحديد رقم الـ Port حيث تأخذ القيمة صفر وكما يلي:

C#:
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("10.0.0.10"), 0);

VB.NET:
Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Parse("10.0.0.10"), 0)

وتتم عملية الإرسال مباشرة باستخدام الـ Sendto Method بعد تحديد الشكل العام للـICMP Header Format حيث ترسل محتوياته كـ Byte Array وتتم عملية الاستقبال باستخدام الـ ReceiveFrom Method وبنفس الطريقة التي أرسل بها ، ولإنشاء ICMP Header Class يجب التقيد بالشكل العام لهذا البروتوكول والـData Type لكل Field وكما هو واضح في الجدول 15-3 التالي:

Data Variable	Size	Type
Type 1 byte Byte
Code 1 byte Byte
Checksum 2 bytes Unsigned 16-bit integer
Message multibyte Byte array

ولإنشاء الـ ICMP Class يجب التقيد بالتركيب العام للـ ICMP Header وكما يلي:

C#:
class ICMP
{
public byte Type;
public byte Code;
public UInt16 Checksum;
public int MessageSize;
public byte[] Message = new byte[1024];
}

VB.NET:
Class ICMP
Public Type As Byte
Public Code As Byte
Public Checksum As UInt16
Public MessageSize As Integer
Public Message As Byte() = New Byte(1024)
End Class

سنقوم الآن بتنفيذ برنامج بسيط لإجراء عملية الـ Ping ومن المعروف أن الـ Ping يستخدم الـ Type 8 لإرسال والـ Type 0 عند الاستقبال حيث يقوم الطرف المقابل باستقبال الرسالة وإعادة إرسالها كما هي إلى الـSourceAddress ، وإذا تم استقبال الـ ICMP Message بالـ Type 0 هذا يعني انه تم الوصول إلى الـDestination ويمكن التحقق من وصول الـ ICMP Header بالشكل الصحيح بعد حساب ناتج الـ Checksum فإذا تطابق مع مقلوب مجموع الـHeader Data عندها نستطيع معرفة أنه تم تسليم الـMessage لـ Destination بشكل الصحيح

وللبدء بالتطبيق سيكون الشكل العام للبرنامج كما في الشكل التالي:

ICMP_Trace_Ping.jpg

ولإنشاء الـ ICMP Class يجب أولا تعريف الـ ICMP Header وتحويله إلى Byte Array بعد إسناد الـPing Data التي نريدها إليه وكما يلي:

C#:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class ICMP
{
public byte Type;
public byte Code;
public UInt16 Checksum;
public int MessageSize;
public byte[] Message = new byte[1024];
public ICMP()
{
}
public ICMP(byte[] data, int size)
{
Type = data[20];
Code = data[21];
Checksum = BitConverter.ToUInt16(data, 22);
MessageSize = size - 24;
Buffer.BlockCopy(data, 24, Message, 0, MessageSize);
}

public byte[] getBytes()
{

byte[] data = new byte[MessageSize + 9];
Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1);
Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1);
Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2);
Buffer.BlockCopy(Message, 0, data, 4, MessageSize);
return data;

}

public UInt16 getChecksum()
{

UInt32 chcksm = 0;
byte[] data = getBytes();
int packetsize = MessageSize + 8;
int index = 0;
while ( index < packetsize)
{
chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index));
index += 2;
}
chcksm = (chcksm >> 16) + (chcksm & 0xffff);
chcksm += (chcksm >> 16);
return (UInt16)(~chcksm);

}
}

VB.NET:
Imports Microsoft.VisualBasic
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Friend Class ICMP
Public Type As Byte
Public Code As Byte
Public Checksum As UInt16
Public MessageSize As Integer
Public Message As Byte() = New Byte(1023)
Public Sub New()
End Sub

Public Sub New(ByVal data As Byte(), ByVal size As Integer)
Type = data(20)
Code = data(21)
Checksum = BitConverter.ToUInt16(data, 22)
MessageSize = size - 24
Buffer.BlockCopy(data, 24, Message, 0, MessageSize)
End Sub

Public Function getBytes() As Byte()
Dim data As Byte() = New Byte(MessageSize + 9 - 1)
Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1)
Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1)
Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2)
Buffer.BlockCopy(Message, 0, data, 4, MessageSize)
Return data
End Function

Public Function getChecksum() As UInt16
Dim chcksm As UInt32 = System.Convert.ToUInt32(0)
Dim data As Byte() = getBytes()
Dim packetsize As Integer = MessageSize + 8
Dim index As Integer = 0
Do While index < packetsize
chcksm +=chcksm Convert.ToUInt32(BitConverter.ToUInt16(data, index))
index += 2
Loop
chcksm = (chcksm >> 16) + (chcksm And &HFFFF)
chcksm += (chcksm >> 16)
Return System.Convert.ToUInt32((Not chcksm))
End Function
End Class

حيث قمنا بإنشاء الـ getBytes Method لتحويل الـ ICMP Packet إلى Byte Array باستخدام الـBitConverter.GetBytes Method وأنشئنا الـ getChecksum Method لحساب الـ Checksum للـICMP Packet حيث سيسند إليه وسيستخدم لعملية التحقق من وصول الـ Packet Header للـ Destination بالشكل الصحيح ...

ويمكن استخدام الـ Class السابق مباشرة بعد تعريف Raw Socket ثم تعريف IPEndpoint Object لإسناده إلى sendto Method ثم اشتقاق instance Object من الـICMP Class السابق و إسناد قيم ابتدائية للـ ICMP Header وإنشاء ICMP Message وتحويلها إلى Byte Array وفي النهاية يمكننا إرسالها إلى الـ Destination باستخدام الـ sendto method وبتأكيد يمكننا تغير مدة الـ Time Out للمدة التي سينتظرها الـSource إلى حين الدخول على الـ SocketException في حالة عدم الاستجابة ويتم كل ذلك كما يلي:

C#:
byte[] data = new byte[1024];
int recv;
Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw,ProtocolType.Icmp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(textBox1.Text),0);
EndPoint ep = (EndPoint)iep;
ICMP packet = new ICMP();

packet.Type = 0x08;
packet.Code = 0x00;
packet.Checksum = 0;

Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 0, 1);

data = Encoding.ASCII.GetBytes("Ping Message OK");

Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length);
packet.MessageSize = data.Length + 4;
int packetsize = packet.MessageSize + 4;
UInt16 chcksum = packet.getChecksum();
packet.Checksum = chcksum;

host.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout, 1000);

host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep);

VB.NET:
Dim data As Byte() = New Byte(1023)
Dim recv As Integer
Dim host As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Raw,ProtocolType.Icmp)
Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Parse(textBox1.Text),0)
Dim ep As EndPoint = CType(iep, EndPoint)
Dim packet As ICMP = New ICMP()



packet.Type = &H08
packet.Code = &H00
packet.Checksum = 0

Buffer.BlockCopy(BitConverter.GetBytes(CShort(1)), 0, packet.Message, 0, 2)
Buffer.BlockCopy(BitConverter.GetBytes(CShort(1)), 0, packet.Message, 2, 2)

data = Encoding.ASCII.GetBytes("Ping Message OK")

Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length)
packet.MessageSize = data.Length + 4
Dim packetsize As Integer = packet.MessageSize + 4
Dim chcksum As UInt16 = packet.getChecksum()
packet.Checksum = chcksum

host.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout, 1000)
host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep)

ولاستقبال الرد على الرسالة من الـ Destination سنستخدم نفس التعريف السابق للـ Socket حيث سنستخدم الـReceiveFrom Method ونسند إليها الـ Reference Value للـ IPEndpoint الذي أرسلنا من خلاله الرسالة ، ونسند الرد الذي تم استقباله إلى الـ ICMP Instance Object الذي أنشئ من الـ ICMP Class ، ويتم كل ذلك كما يلي:

C#:
try
{
data = new byte[1024];
recv = host.ReceiveFrom(data, ref ep);
}
catch (SocketException)
{
listBox1.Items.Clear();
listBox1.Items.Add("No response from remote host");
return;
}
ICMP response = new ICMP(data, recv);
listBox1.Items.Clear();
listBox1.Items.Add("response from: "+ ep.ToString());
listBox1.Items.Add(" Type: "+ response.Type);
listBox1.Items.Add(" Code: "+ response.Code);
int Identifier = BitConverter.ToInt16(response.Message, 0);
int Sequence = BitConverter.ToInt16(response.Message, 2);

listBox1.Items.Add(" Identifier: "+ Identifier);
listBox1.Items.Add(" Sequence: "+ Sequence);
string stringData = Encoding.ASCII.GetString(response.Message,4, response.MessageSize - 4);
listBox1.Items.Add(" data: "+stringData);
host.Close();

VB.NET:
Try
data = New Byte(1023)
recv = host.ReceiveFrom(data, ep)
Catch e1 As SocketException
listBox1.Items.Clear()
listBox1.Items.Add("No response from remote host")
Return
End Try

Dim response As ICMP = New ICMP(data, recv)

listBox1.Items.Clear()
listBox1.Items.Add("response from: " & ep.ToString())
listBox1.Items.Add(" Type: " & response.Type)
listBox1.Items.Add(" Code: " & response.Code)

Dim Identifier As Integer = BitConverter.ToInt16(response.Message, 0)
Dim Sequence As Integer = BitConverter.ToInt16(response.Message, 2)

listBox1.Items.Add(" Identifier: " & Identifier)
listBox1.Items.Add(" Sequence: " & Sequence)

Dim stringData As String = Encoding.ASCII.GetString(response.Message,4, response.MessageSize - 4)
listBox1.Items.Add(" data: " & stringData)
host.Close()

ويمكننا أيضا استخدام الـ Class السابق لإنشاء برنامج لعمل الـ Tracing ومن المعروف بالـ Routing Tracing انه يقوم بتعقب الـ Hops أو الـ Routers التي يمر عبرها الـPacket حيث يرجع كل Router يمر الـ Packet من خلاله ICMP Replay Message تحتوي على الـ Message التي أرسلت بالإضافة إلى الـ IP للـ Router الذي تم تمرير الـMessage من خلاله والوقت الذي استغرق للوصول إلى كل Router حتى وصول الـ Packet إلى الـ Destination

وكما هو واضح من تعريف الـ Tracing فإن البرنامج سيعتمد على جلب الـ IP لكل Router يمر من خلاله إلى حين الوصول إلى الطرف المعني ويمكن إجراء هذه العملية باستخدام الـ IpTimeToLive ضمن الـSetSocketOption Method حيث نضعها داخل Loop وفي كل مرة نزيد الـ Loop بمقدار واحد ونسند قيمته إلى الـ TTL حيث يعبر كل TTL عن Hop أو Router تم المرور من خلاله ويتم إرسال Ping Message إلى ذلك الـ Hop وخلال ذلك نقيس الفترة الزمنية المستغرقة بين عملية إرسال الـ Ping واستقبال الرد من كل Hop إلى حين الوصول إلى آخر Hop مر الـ Packet من خلاله ويمكننا قياس ذلك باستخدام الـ TickCount ضمن الـEnvironment Class وترجع هذه الـ Property قيمة Integer بالـ Millisecond من بدأ نظام التشغيل بالعمل إلى الوقت الحالي حيث يمكننا اخذ هذه القيمة عند بداية عمل الـ Ping وأخذها مرة أخرى عند استقبال الرد ومن ثم طرح القيمة الأولى من الثانية ...، ويتم كل ذلك كما يلي:

C#:
byte[] data = new byte[1024];
int recv, timestart, timestop;

Socket trace_socket = new Socket(AddressFamily.InterNetwork,SocketType.Raw, ProtocolType.Icmp);

IPHostEntry dest = Dns.Resolve(textBox2.Text);
IPEndPoint iep = new IPEndPoint(dest.AddressList[0], 0);
EndPoint ep = (EndPoint)iep;

ICMP packet = new ICMP();
packet.Type = 0x08;
packet.Code = 0x00;
packet.Checksum = 0;
Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 0, 2);
Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 2, 2);
data = Encoding.ASCII.GetBytes("Tracing is OK,FADI Abdel-qader");
Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length);
packet.MessageSize = data.Length + 4;
int packetsize = packet.MessageSize + 4;
UInt16 chcksum = packet.getChecksum();
packet.Checksum = chcksum;

trace_socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout, 1000);
int badcount = 0;

for (int i = 1; i < 50; i++)
{
trace_socket.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.IpTimeToLive, i);
timestart = Environment.TickCount;
trace_socket.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep);

try
{
data = new byte[1024];
recv = trace_socket.ReceiveFrom(data, ref ep);
timestop = Environment.TickCount;

ICMP response = new ICMP(data, recv);

if (response.Type == 11)
listBox1.Items.Add("hop response from ms"+ i+ ep.ToString()+ (timestop-timestart));

if (response.Type == 0)
{
listBox1.Items.Add(" reached in hops, ms " + ep.ToString()+ i+ (timestop-timestart));
break;
}
badcount = 0;
}
catch (SocketException)
{
listBox1.Items.Add("hop No response from remote host "+ i);
badcount++;
if (badcount == 5)
{
listBox1.Items.Add("Unable to contact remote host");
break;
}
}
}

trace_socket.Close();

VB.NET:
Dim data As Byte() = New Byte(1023)
Dim recv, timestart, timestop As Integer

Dim trace_socket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp)

Dim dest As IPHostEntry = Dns.Resolve(textBox2.Text)
Dim iep As IPEndPoint = New IPEndPoint(dest.AddressList(0), 0)
Dim ep As EndPoint = CType(iep, EndPoint)

Dim packet As ICMP = New ICMP
packet.Type = &H08
packet.Code = &H00
packet.Checksum = 0
Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 0, 2)
Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 2, 2)
data = Encoding.ASCII.GetBytes("Tracing is OK,FADI Abdel-qader")
Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length)
packet.MessageSize = data.Length + 4

Dim packetsize As Integer = packet.MessageSize + 4
Dim chcksum As UInt16 = packet.getChecksum()

packet.Checksum = chcksum

trace_socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout, 1000)
Dim badcount As Integer = 0

For i As Integer = 1 To 49
trace_socket.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.IpTimeToLive, i)
timestart = Environment.TickCount
trace_socket.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep)

Try
data = New Byte(1023)
recv = trace_socket.ReceiveFrom(data, ep)
timestop = Environment.TickCount

Dim response As ICMP = New ICMP(data, recv)

If response.Type = 11 Then
listBox1.Items.Add("hop response from ms" & i+ ep.ToString()+ (timestop-timestart))
End If

If response.Type = 0 Then
listBox1.Items.Add(" reached in hops, ms " & ep.ToString()+ i+ (timestop-timestart))
Exit Try
End If
badcount = 0
Catch e1 As SocketException
listBox1.Items.Add("hop No response from remote host " & i)
badcount += 1
If badcount = 5 Then
listBox1.Items.Add("Unable to contact remote host")
Exit For
End If
End Try
Next i
trace_socket.Close()

وهكذا بينا كيفية استخدام الـ ICMP في الدوت نيت وكيفية استخدامه لإنشاء برنامج لعمل الـ Ping وآخر لعمل الـRouting Tracing ،

Introduction to Packet Sniffing Applications

تكمن الفكرة الأساسية من الـ Packet Sniffing Applications بالتصنت على الـNetwork Layer أو الـRawSocket بعد اختيار الـNetwork Interface إذ أنها لا تعمل ضمن نطاق Port محدد ونستطيع من خلال الـ Raw Socket التقاط أي Packet يمر من خلال الـ Network Interface Card ولتحليل الـPacket لابد من معرفة الحجم الكلي لكل Header ثم إضافته ، وبشكل دائم يتم إضافة الـ Header Length إلى كل Header ضمن كل طبقة من طبقات الـ TCP/IP ، لاحظ موقع الـ Header Length في كل Header من بروتوكولات الـTCP/IP :

25_07_06_05_09_34_1153872574row.JPG

ويمكننا فصل كل Layer عن الأخرى بعد معرفة الـ Header Length لكل Layer ، لاحظ من الشكل السابق انه يمكننا معرفة الحجم الكلي للـ Packet من خلال الجزء الأول منه والمسمى بالـ Frame , ويمكننا مثلا معرفة الـ IP Address لطرف المرسل من خلال تخزين الـ Packet الملتقط في Byte Array ثم تغيير الـ offset للـمكان الذي نريد القراءة منه ، إذ يأتي موقع الـ IP Source Address في الـ IP Packet دائما بعد 12 Bytes لاحظ الشكل التالي:

25_07_06_05_16_23_1153872983row_.JPG

ويجب دائما إنشاء Class أو Struct يحتوي على الـ Header Elements لكل Protocol يتم التعامل معه وحتى نستطيع تحليله لاحقا ، وتحديد سعة كل منها بناء على السعة الحقيقية لها وكمثال لإنشاء Struct خاص بالـIPHeader :

C#:
public struct IPHeader
{
[FieldOffset(0)] public byte ip_verlen; //IP version and IP Header length
[FieldOffset(1)] public byte ip_tos; //Type of Service
[FieldOffset(2)] public ushort ip_totallength; //Total Packet Length
[FieldOffset(4)] public ushort ip_id; //Unique ID
[FieldOffset(6)] public ushort ip_offset; //Flags and Offset
[FieldOffset(8)] public byte ip_ttl; //Time To Live
[FieldOffset(9)] public byte ip_protocol; //Protocol (TCP, UDP, ICMP, Etc.)
[FieldOffset(10)] public ushort ip_checksum; //IP Header Checksum
[FieldOffset(12)] public uint ip_srcaddr; //Source IP Address
[FieldOffset(16)] public uint ip_destaddr; //Destination IP Address
}

VB.NET:
Public Structure IPHeader
<FieldOffset(0)> _
Public ip_verlen As Byte 'IP version and IP Header length
<FieldOffset(1)> _
Public ip_tos As Byte 'Type of Service
<FieldOffset(2)> _
Public ip_totallength As System.UInt16 'Total Packet Length
<FieldOffset(4)> _
Public ip_id As System.UInt16 'Unique ID
<FieldOffset(6)> _
Public ip_offset As System.UInt16 'Flags and Offset
<FieldOffset(8)> _
Public ip_ttl As Byte 'Time To Live
<FieldOffset(9)> _
Public ip_protocol As Byte 'Protocol (TCP, UDP, ICMP, Etc.)
<FieldOffset(10)> _
Public ip_checksum As System.UInt16 'IP Header Checksum
<FieldOffset(12)> _
Public ip_srcaddr As System.UInt32 'Source IP Address
<FieldOffset(16)> _
Public ip_destaddr As System.UInt32 'Destination IP Address
End Structure

ولتفعيل عملية التصنت على الـ IP Layer يجب تعريف Raw Socket ونحدد فيها الـ IP كـ Protocol Type ثم نقوم بعمل الـ Binding مع الـ IP Address للـ Interface Card الذي نريد التصنت عليه ، وبتأكيد لا تحتاج الـ Raw Socket تحديد Port معين إذ أنها لا تتعامل مع أي من الـ Transport Layer Protocols ، ويتم ذلك كما يلي:

C#:
socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
socket.Bind(new IPEndPoint(IPAddress.Parse(“10.0.0.10”), 0));
socket.BeginReceive(m_Buffer, 0, m_Buffer.Length, SocketFlags.None, new AsyncCallback(this.OnReceive), null);

VB.NET:
socket = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP)
socket.Bind(New IPEndPoint(IPAddress.Parse(“10.0.0.10”), 0))
socket.BeginReceive(m_Buffer, 0, m_Buffer.Length, SocketFlags.None, New AsyncCallback(AddressOf Me.OnReceive), Nothing)

ثم إضافة الـ AsyncCallback Method للـ BeginReceive Method السابقة ويتم ذلك كما يلي:

C#:
private void OnReceive(IAsyncResult ar)
{
int received = socket.EndReceive(ar);
if (socket != null)
{
byte[] packet = new byte[received];
Array.Copy(Buffer, 0, packet, 0, received);
// Here The all Captured Packet in The Buffer
}
socket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(this.OnReceive), null);
}

VB.NET:
Private Sub OnReceive(ByVal ar As IasyncResult)
Dim received As Integer = socket.EndReceive(ar)
If Not socket Is Nothing Then
Dim packet As Byte() = New Byte(received)
Array.Copy(Buffer, 0, packet, 0, received)
‘ Here The all Captured Packet in The Buffer
End If
socket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, New AsyncCallback(AddressOf Me.OnReceive), Nothing)
End Sub

وفي هذه المرحلة فإن أي Packet يمر من خلال الـ Network Layer يتم التقاطه وتخزينه في الـ Buffer السابق، حيث يمكن تحليله لاحقا بحسب حجم الـ Header للـPacket الملتقط بالإضافة إلى معرفة الحجم لكل Element في الـ Header ...

امل من الله أن تكونوا قد استفتم من هذا الدرس وان يكون قد فتح لكم افاق جديدة لتفكير :)

ICMP_Trace_Ping.zip

تم تعديل بواسطه فادي عبدالقادر
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من قال أن الأعضاء أهملوا الموضوع فأنا على المستوى الشخصي أعتبر هذا الموضوع مرجع لي في كل صغيرة و كبيرة في الNetwork Programming

جزالك الله خير على تعبك معنا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا جزيلا لك اخي باشمهندس وبارك الله بك

ونحن بخدمة المبرمجين في أي من الأمور التي يحتاجونها

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الأخ الكريم و الأستاذ الفاضل .. فادي

جزاااك الله عنا كل الخير .. و كيف خُيل لك أن أحدا يمل من موسوعتك الذهبيه في عالم الشبكات ..!!

إلى الأماااام يالغالي .. والكل متابعك و يرمقك بغبطه و فخر يامُبدع ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله

في Exeption غريب بيطلعلي لما بعمل Client server عادي بيبعت message

بيقول Can't access disposed object

object name :System.Net.Sockets.Networkstream

مع الClient لما يبعت

مع العلم اني عامل using System.Net.Socket

والFierwall مش قافل حاجة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هل تأكدت أن الإتصال مع الـSocket سليم وان الـConnected Property الموجودة ضمن الـSocket ترجع قيمة True , ارجو التأكد من هذه النقطة اولا ثم ارفاق الكود إن امكن

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

Make your H323 Calls

Voice Chat under TAPI H323

More and More :)

h323.jpg

you can register the Open H323 OCX File as below

regsvr32 openh323.ocx

H323_Voice_Chat.zip

تم تعديل بواسطه فادي عبدالقادر
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

لدي سؤال اخي الكريم

لو عملت برنامج يدعم شبكة محليه

هل نفس الكود كفيل في جعل البرنامج يدعم عن طريق الإنترنت ؟

اريد عمل برنامج شبيه بالماسنجر

هل برمجة TCP كفيلة بذلك وما يميز برمجة شبكات الإنترنت

اطيب تحيه لكم

السلام عليكم

لدي سؤال اخي الكريم

لو عملت برنامج يدعم شبكة محليه

هل نفس الكود كفيل في جعل البرنامج يدعم عن طريق الإنترنت ؟

اريد عمل برنامج شبيه بالماسنجر

هل برمجة TCP كفيلة بذلك وما يميز برمجة شبكات الإنترنت

اطيب تحيه لكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم اخي الكريم واهلا بك ,

لن يختلف الأمر بشيء الـSocket ستعمل سواء كان البرنامج سيعمل على الشبكة المحلية أم على الإنترنت , لكن هناك مجموعة من الأمور التي قد تغيب عن البعض عن عمل أي برنامج سيعمل على الإنترنت منها , التوافقية والأداء الجيد إذ يفضل دائما عن ارسال النتائج او الإتصال من خلال الإنترنت استخدام ماهو متاح فمثلا استخدام بروتوكل الـSOAP في عملية التراسل بحيث ترسل المعلومات كـXML من خلال الـHTTP بلإضافة إلى مراعاة طبيعة البيانات المرسلة واستخدام اساليب الضغط ما امكن إذ يوجد الآن ادوات جاهزة يمكن استخدامها لضغط الـStream قبل عملية الإرسال مما يساهم بشكل كبير في رفع اداء البرنامج الذي سيعمل على الإنترنت.

ويوجد امر اخر ( هل سيكون برنامج التراسل Client/Server أم Peer-to-Peer ) في الحالة الآولى يجب أن يكون الـServer على شبكة يمكن الدخول من خلالها إما باستخدام Real IP أو بالستخدام الـ Port Forwarding تقوم بعمله على الـRouter ويتم بناء على الـPort Number الذي ستسخدمه في برنامج التراسل الخاص بك , أما في حالة لم يكن هنالك Server فلديك حلين :

الأول : عمل VPN Connection بين الجهازين بحيث تصبح وكأنك ضمن شبكته المحلية

الثاني : عمل الـPort Forwarding في كلا الطرفين الأول والثاني وبناء على الـPorts التي حددتها

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

fmo_82 يعطيك العافيه

جربت كود عادي TCPlistnو tcpclient في الانترنت

وماشاء الله ضبط وكأنه شبكة محليه تماماً

هل هناك ادوات فعلا لضغط stream وفك الضغط عنه ؟ياليت تنورنا بهذه النقطة لو سمحت

اطيب تحيه لك B)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .