الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برمجة الشبكات ..

مغلقرائج
بدأه HGB في 17 ديسمبر 2003 · 67 رد · 20,865 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ,,

الحمد لله هاقد بدأنا الموضوع الذي طال انتظاره ,, وأرجو الله أن يستمر بشكل جيد دون مشاكل ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

عندما قلت شبكات فأنا أقصد بذلك كل ماله علاقه بالشبكات ,, من أي نوع يعتمد على Client/Server وال Peer To Peer ,, (" يمكن كتابة برنامج يعمل شبكة لجهاز واحد ,, بحيث يكون هو ال Client وال Server في نفس الوقت ") كل برامج الشبكات التي تعمل على شبكة LAN مثلا مربوطة بأي نوع من الاسلاك مثلا ال CAT 5 يمكن تعميمها على الانترنت ,, يعني البرامج التي سنكتبها ستعمل على الانترنت والشبكات المحلية ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

كيف سنتعلم ؟

الطريقة التي أعتقد في نظري أنها أفضل لمثل هذا النوع هي كتابة البرامج الكاملة ,, لاأفضل من ذلك مطلقا ,, لأنه بالنسبة لبرمجة الشبكات الخبرة البرمجية لن تلعب دورا كما هو دور خبرة التعامل مع أنواع ال Servers ,, مثلا اذا أردنا كتابة برنامج لارسال E-MAIL فاننا سنتعامل مع برتكول يسمى SMTP "Simple Mail Transfer Protocol " وهو عبارة عن طريقة لتخاطب ال Client مع ال Server بحيث يستلم ال Server رسالة ال E-MAIL من ال Client ليوجهها حسب العنوان الذي طلبه المستخدم ,,

معرفة طريقة عمل برتكول ال SMTP هي المشكلة الوحيدة ,, لأننا يجب أن نعرف اننا سنقوم بارسال البيانات لسيرفر اسمه مثلا mail.arabteam2000.com للمنفذ PORT رقم 25 وهو المنفذ الخاص ب ال SMTP ,, وبعد كل هذا سنقوم بارسال أوامر خاصة للسيرفر سيقوم هو باستقبالها ويرد بأمور أخرى ,, يجب أن نجهز برنامجنا ليتعامل معها ,, الامر ليس معقدا فقط يحتاج لبعض الحذر ,,

يمكن عمل مسح للمنافذ المفتوحة في جهاز معين مثلا كما هي برامج ال Ping Flash مهمتها معرفة المنافذ التي قامت أحصنة الطروادة بفتحها للدخول على الجهاز منها ,, وهي أسس الهاكينج ,, وبالطبع يمكن كتابة Ping Flasher للفحص ععلى جهاز معين أيضا لمعرفة هل هو مصاب بنوع معين من أحصنة الطروادة أم لا واذا كان يتم اغلاق المنفذ ,, فهو لوقاية وللخراب في نفس الوقت ,,

يمكن عمل برامج WhoIs لمعرفة معلومات معينة عن موقع أو IP ADDRESS معين أو حتى E-MAIL ,, معلومات جغرافية أو أي نوع اخر من المعلومات ,,

في مضمار اخر من برمجة الشبكات سنكتب برنامجا لحساب زمن الاتصال بانترنت ,, بالطبع سيبدأ العدادا الحساب من وقت الدخول الى الانترنت مباشرة وحتى انقطاع الاتصال ,, لكن كيف يعرف الجهاز أنك متصل بانترنت ؟ توجد عدة طرق لكن أفضلها لمن يتصل بانترنت عن طريق الهاتف عليه أن يستخدم RAS Remote Access Server ,, وهو حساس يراقب عملية اتصال جهازك بالسيرفر المقدم لخدمة الانترنت ويبلغك بكل تفاصيل التخاطب لاجراء عملية الاتصال !!

البرامج التي يمكن عملها بهذا النوع من البرمجة فقط يتوقف على اختراعات البشرية في هذا المجال ,, كل برامج الشبكات على الاطلاق يمكن كتابتها بهذه الطريقة ,,لكن كما ذكرت ستواجهنا مشاكل في بعض التقنيات والاليات التي يمكن معرفتها ,,لأننا سنكتب البرامج على المستوى الادنى مطلقا ,, لن نستخدم فئات جاهزة تقوم بمهام كبيرة مثلا ارسال E-MAIL بل سنقوم نحن بكتابتها ,,

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

كل التقنيات التي سنكافح لنتعلمها هنا قد تكون للخير وللشر ,, وماعلينا الاالبلاغ ,,

أخيرا كما ذكرت التعلم سيكون جماعيا ,, يعني أنا لست مؤهلا بشكل كامل لأطرح دروس فقط ,, لكن بالتعلم الجماعي ومحاولة الوصول لنتيجة معينة سيكون خط التعلم أسرع وأكثر فائدة ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

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

هذه المقدمة مختصرة جدا ,, لأني لاأريد الحديث كثيرا نريد الدخول في العظم مباشرة ,,

سأضيف الجلسة الثانية هذا المساء ,,

وأرجو من الاخ chik أن يتحمل معنا المأمورية لأنه مبرمج هذا المنتدى الهمام نفعنا الله به,, وبارك الله فيكم ,,

هذان كتابان للتحميل أرجو أن يفو بالغرض الأول ممتاز ومختصر سريع :

http://www.arabteam2000.com/hgb/bgnet.pdf

http://www.arabteam2000.com/BookLib/show.asp?Id=219

الثاني مفصل أكثر وأفيد للتقدم لاحقا :

تم تعديل هذه المشاركة بواسطة HGB في 20 مارس 2005 في 01:13

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#2

السلام عليكم,

لقد كتبت في الموضوع السابق وكنت لم أرى هدا الموضوع.

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

برامج الإتصال Server/Client ببروتوكول Tcp/IP .

برامج تحديد اسم الكمبيوتر المتصل به.

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

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

والأفكار يمكن أن تأتي من الجميع.

وقد وضعت في هدا المنتدى مثالا ل Server/Client إدا أراد الإخوان أن يكون منطلقا للدراسة وسأكون إن شاء الله رهن الإشارة في أي استشارة أو شغل.

أتمنى لنا التوفيق وإلى اللقاء إن شاء الله.

#3

الله يعطيكم العافية ،،

أخوي HGB ،، ما يحتاج تحميل أي برنامج من ألحين ..؟؟

حتى لا نتأخر عنكم ..؟؟

و إيش المتطلبات لمعرفة و فهم هذه البرمجة ..؟؟

هل تكفينا البرمجة بلغة السي بلس بلس أم إنه مالها أي علاقة ..؟؟

و جزاكم الله كل خير ،،

و تروني متابعة بإذن الله ،، أول بأول :)

#4

السلام عليكم ,,

أختي العصاميه ,, بارك الله فيكي ,, لانحتاج مطلقا لأي شيء لتحميله هنا ,, كل المكتبات موجودة مع الوندوز ,, لحسن الحظ ,,

المتطلبات كما ذكرت ستابقا ,, معرفة 20 % فقط من السي++ !!!

بالطبع يمكن أن نكتب بالسي++ أو السي ,, لايهم ,, لكننا سنعتمد السي++ ,,

سأطرح الموضوع الاول بعد قليل ,, كان من المفترض أن أطرحه أمس ,, لكن يبدو أنني لم أقل إن شاء الله :)

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#5

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

اقتباس
لانحتاج مطلقا لأي شيء لتحميله هنا ,, كل المكتبات موجودة مع الوندوز ,, لحسن الحظ ,,

الحمد لله ،، و الله كنت شايلة هم ،،

و بالفعل متحممممسة للموضوع و البركة فيكم ،،

اقتباس
المتطلبات كما ذكرت ستابقا ,, معرفة 20 % فقط من السي++ !!!

الحمد لله ،، مستواي بالبرمجة ،، لا بأس به ،،

يمكن بس الـ file ما تعمقت فيه بالمررة و بتطبيق برامج بسيطة فقط ،،

المهم ،،

اقتباس

يبدو أنني لم أقل إن شاء الله

معذرة ،، :)

بس أحببت التعليق بإنها ( إن شاء الله ) و ليست ( إن شاء الله ) ،،

و جزاك الله خير ،،

و نحن بإنتظار بقية الدروس ،، :)

تم تعديل هذه المشاركة بواسطة العصاميه في 18 ديسمبر 2003 في 14:49

#6

السلام عليكم ,,

هاقد عدنا مجددا ,, برمجة الشبكات التي سنعمل عليها هي ال WinSocket ,, وهي في الاساس مكتبة دوال Wi32 Api ,, لكن MFC قامت بتغليفها بفئات وأوامر تحاول أن تسهل الامر ,, لكن لاأنصح بها ,, نظرا لأن متطلباتها أكثر ,, اذ تحتاج لمكتبات ال MFC لتكون مشحونة مع البرنامج ,,لذا سنعتمد WinSock32 api ,,

ملف الرأس الذي سنضيفه هو winsock.h ,,, والمكتبة التي سنقوم بتضمينها هي wsock32.LIB ,, فقط هكذا أصبحنا جاهزين للعمل ,,

توجد نسختين من ال Winsock النسخة 1 و2 ,, لكن لم أعرف الفرق بينهما بعد ,,

أكيد كلكم يعرف أن يقوم با include ل winsock.h ,, لكن تضمين المكتبة قد يكون أمرا جديدا ,, لتضمين المكتبة قم بالتالي :

في Visual c++ 6 : اذهب الى القائمة Project ثم Setting ثم Links ثم ستجد في مربع الحوار جزء مكتوب فيه Object/Library Moudels ,, اذهب الى اخره ثم اضغط مسافة واكتب wsock32.lib ثم اضغط Enter ,, فقط !!

هكذا أنت جاهز للبدأ تماما,,

في Visual Studio.NET : اذهي الى Class View "على الجانب الايمن افتراضيا ,, وهي التي بها الفئات المعرفة ضمن برنامج " ثم اضغط على اسم البرنامج فيها بالزر الايمن ثم Properties ثم Linker ثم Input في الخانة Additional Dependencies ,, اكتب wsock32.lib ثم ok ,, فقط ,,!!

هكذا انت جاهز لبيئة .NET ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

الان فلنبدأ بالدوال :

الدالة التي تبتدأ لنا خدمات ال winsocket هي :

WSAStartup(wVersionRequested, &wsaData);

البارمتر الاول ,, نمرر له النسخة المطلوبة من ال Winsock على الشكل :

WORD wVersionRequested = MAKEWORD(1,1);

من الملاحظ أن النوع WORD هو 2 بايت أي أنه تماما مثل ال short ,, لكن يفضل لأن نتعامل مع WORD ,,

الان البارمتر الثاني سنستلم فيه معلومات عن النسخة المفعلة ,, وهي أمور للتحقق فقط من أن النسخة المستعملة حاليا مدعومة من النظام ,,

الان ابتدئنا خدمات Winsocket بشكل كامل ,,

الدوال المستخدمة في التعامل كالتالي ,, سأقوم بسرد سريع لأكثر الدوال استخداما ,,

أولا socket ,, مهمتها تمهيد طريقة التعامل بال Socket ,, مثلا نريد دعم TCP/IP أو UDP ,, نريد أستخدام Protocol معين في التخاطب ,, وطريقة تعيين ال Address حيث هناك الكثير من الطرق ,, تصريح الدالة كالتالي :

int socket(in domain, int type, int protocol);

وهنا استعمال ,, للتعامل بعناوين IP من برتوكول TCP/IP كما في الانترنت ,, مع Stream للبيانات ,, و استخدام برتوكول TCP/IP في التعامل ,,

socket(AF_INET, SOCKS_STREAM, IPPROTO_TCP);

,,,,,,,,,,,,,,,,,,,,,,,,

ثانيا : bind ,, لفتح Port منفذ معين ,,

التصريح كالتالي :

int bind ( SOCKET s,const sockaddr *addr,int namelen);

,,,,,,,,,,,,,,,,,,,,,,

ثالثا : connect ,, للقيام بعملة ربط الاتصال مع Server معين ,,

التصريح ,,

int connect (SOCKET s, const struct sockaddr FAR *name, int namelen);

,,,,,,,,,,,,,,,,,,,,,,

رابعا :listen ,, للقيام بالاستماع لمنفذ PORT معين وانتظار اشارة من Client ,, دائما مايستعمل هذا الامر من قبل ال Server لينتظر عملية اتصال من Client,,

التصريح :

int listen (SOCKET s, int backlog);

,,,,,,,,,,,,,,,,,,,,,,

خامسا :accept ,, لقبول ال Server اتصالا معينا من Client ,,

التصريح :

SOCKET accept (SOCKET s, struct sockaddr FAR *addr,int FAR *addrlen);

,,,,,,,,,,,,,,,,,,,,,

سادسا : send ,, بالطبع هو أهم أمر تقريبا لأنه الذي نرسل به البيانات ,, من كل الانواع ,, لنتخاطب مع ال Server ,,

التصريح :

int send (SOCKET s, const char FAR * buf, int len, int flags);

,,,,,,,,,,,,,,,,,,,,

سابعا : recv ,, وهو أهم أمر أيضا من قبل ال Server لأنه الذي سيقوم باستلام البيانات القادمة نت ال Client ,, التصريح كالتالي :

int recv (SOCKET s, char FAR * buf, int len, int flags);

,,,,,,,,,,,,,,,,,,,

ثامنا :close ,, لاغلاق ال Socket الذي تم انشاءه في باستخدام الدالة socket أعلاه ,,

التصريح :

int close(int);

,,,,,,,,,,,,,,,,,,,

تاسعا : shutdown ,, للتحكم بعملية اغلاق ال Socket مثلها مثل close ,,لك نبمزيد من التحكم ,,

التصريح :

int shutdown (SOCKET s, int how);

,,,,,,,,,,,,,,,

هكذا نكون قد انتهينا من الاساسيات ,, بقي علينا خلط هذه الدوال لنفعل بها الكثير من الامور ,, من الملاحظ أن استخدامها ليس صعبا مطلقا ,,واليكم المثال المرفق ,, يقوم بعمل PING لموقع معين ,, ليتأكد من أنه حي ويستلم بيانات !! وتسمى هذه العملية بال Echo Request ,,, تستخدم دائما في عمليات الصيانة والتأكد من أن ال Server سليم ولامشكلة لديه ,, الامر المشابه لهذا البرنامج موجود في الوندوز ,, اذهب الى ال Console باستخدام موجه أوامر Dos ,, أو Run ثم cmd ,, وبعد ماتجد شاشة الدوز اكتب الامر التالي :

ping www.arabteam2000.com

أو غيره من المواقع كما تشاء ,, بشرط أن يكون اتصال internet مفتوحا ,, ستجد اسجابة من الموقع ,, أحيانا وأحيانا أخرى لا ,,

اليكم هذا الموقع الذي به الكثير من الامثلة الرائعة ,,

http://www.codeproject.com/internet/

سكون مرجعا لنا في الامثلة,, ومن يعرف مواقع أخرى فليتحفنا ,,

الكتاب مرفق مع الملف المضغوط ,,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

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

وسأقترح أول برنامج لتطويره هذا المساء ,, لنتعلم ونكتب برامج على التوازي ,,

وقد راودتني فكرة رائعة فعلا ,, قد يكون مشروعا متقدما في الشبكات ,, عبارة عن برنامج يعمل تماما كما تعمل برامج المشاركة على الملفات أمثال ال Kazaa ,, لكن هذا البرنامج سيكون خاصا بأعضاء Arabteam2000 والغرض منه مشاركة الملفات والكتب والبرامج بشكل أكثر فعالية ,, حيث أن الكثير من الاعضاء يملك الكثير من الكتب ,, لكن لايستطيع مشاركتها نظرا لعدم وجود امكانية رفع كل هذه الكتب لموقع معين لحجمها ,, أو خوفا من اغلاق الموقع ,, ففي هذه الحالة لاخير من برامج المشاركة على الملفات ,, عموما هي فكرة ليس الا ,, قد نطورها لاحقا ,, بالطبع ليس الان :)

المثال المرفق طويل قليلا لكنه ليس صعبا مطلقا ,, لو ركزت في الاوامر ستجدها كلها تقليدية ,,

الى المساء,,

Ping.zip

تم تعديل هذه المشاركة بواسطة HGB في 18 ديسمبر 2003 في 16:13

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#7

السلام عليكم,

كما قلت سابقا هدا يدفعنا أ، نكون نعرف برمجة الوندوز وخاصة الطريقة API .

وكل ما سيتغير هنا هي استدعال دوال جديدة خاصة بالشبكات.

وكما يمكن أن نبرمج هدا استعمال MFC وبنفس الطريقة التي تكلم عنها الأخ HGB في عالم NET . رغم أني لم أجربها في هدا النظام الجديد.وبما أننا سنستعمل أقساما جاهزة فهي قد تسهل البرمجة وهدا دائما يبقى نسبيا وكل واحد حسب ما اعتاد عليه.

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

فالطريقة البدائية لهدا والتي كانت من بين الطرق الأولى التي استعملها الهاكرز والتي تعرف بطريقة NetBios هي استعمال برنامج net الموجود في الوندوز والدي يمكن أن نشغله في نافدة دوس. وحين نكتب net يعطينا مختلف الإمكانيات لإستعمال هدا ومن بينها :

net view و net use .

وسنأخد مثالا عن هدين العمليتين.

أفترض أني أريد أن أعرف الكمبيوتر الحامل لرقم IP المعين xxx هل يتقاسم شيئا ما : قرص مجلد الآلة الكاتبة أو غيرها هنا سأقوم بكتابة التالي:

net view \\xxx في نافدة دوس طبعا و xxx هي الأي بي للكمبيوتر ويجب أن يكون شغالا وهنا يمكن أن نتأكد من هدا من خلال عملية ping مثلا.وإدا كان هدا الكمبيوتر يتقاسم شيئا ما سيعطيها لنا البرنامج.نقول مثلا أن الكمبيوتر يتقاسم القرص D .ولكي أتمكن من الولوج إلى هدا الrvz أقوم بالعملية التالية:

net use z: \\xxx\d وهنا z تعني أي حرف سأستعمله مستقبلا ليدل على القرص D الدي يوجد في المكان الآخر.

إدا كان لهدا القرص اسم سر سيطلبني البرنامج من إدخاله .وحين تتم الأمور يمكنني العمل على القرص الآخر كما أستعمل أيا من أقراصي الحالية ودلك باستعمال الحرف z أو أي حرف آخر أكون قد اخترته في الأول.فيمكن مثلا أن أقوم ب dir z: لأرى ما يوجد في القرص كما يمكن أن أنقل ملفا أو أكتب فيه إدا كان الأمر مسموحا.وإدا فتحت explorer في الوندوز فسألحض أنه زاد قرصا اسمه z مع رقم الأيبي ويمكن من هنا أيضا التعامل مع هدا القرص كأنه قرصك تماما.

هده بعض العمليات التي يمكن أن نعتمد عليها إدا كنا نريد برمجة لتقاسم الملفات وهده مجرد فكرة.

في انتضار مقترحات الجميع لنرصخ أهدافنا أقول لكم إلى اللقاء.

#8

السلام عليكم...........

بصراحة مجال برمجة الشبكات طلع إبداع. والأخ HGB ابداعه أكثر وأكثر.

أعذروني أسئلتي بتبدأ من أول جلسة:

1- يا ليت تشرحلي بشوية تفصيل المخرجات الناتجة من البرنامج وطريقة عمله؟

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

3- استغربت كتابة البرنامج بلغة السي يعني في البداية ما فهمته بس الحمد لله استرجعت معلوماتي وفهمته ياليت تنتقل للسي++ أفضل.

4- هل لازم أسوي include لـ wsock32.lib كل ما عملت برنامج جديد؟

5- بما إنه في ping في الويندوز يا ليت تسمي البرنامج باسم ثاني حتى ما تتداخل مع أوامر الويندوز الموجودة.

6- أخيراً في المستقبل لو في أي تحميل مطلوب سواءاً للشبكات أو الـDirectX نتمنى تعطينا لنك التحميل حتى ما نأخرك في الدروس.

#9

السلام عليكم ,,

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

لكن لنا اليه عودة لاحقا ,, بشيء من التفصيل ,, لكن سنبدأ الان ببرنامج لمعرفة عنوان ال IP الخاص بالمستخدم ,,

وسأطرح الامور الازم معرفتها ,, لأنها أساس الاساسيات ,,

كما ذكرت سأكتب أو بالاصح سنكتب البرامج التالية باذن الله باستخدام السي++ ,, من دوال الادخال والاخراج ,, وحتى كاتابة فئات بسيطة ,, لو أردتم ذلك ,, لكن كنت أحاول فقط جعل الامور أسهل مايمكن لابعاد القراء عن موضوع ال OOP لو كانت تسبب لهم مشكلة ,,

الان الاقتراح كالتالي :

نريد أن نخصص برنامجا معين لكل يومين تقريبا ,, حتى ننتهي من تطويره وننتقل الى الاخر ,, فما رأيكم ,,

وأرجو من chik أن يتحفنا ببعض الافكار ,,

البرامج :

1) معرفة ال IP الخاص بمستخدم معين ,,

2) عمل scan للمنافذ ومعرفة المفتوح منها ,,

3) الاستعلام من DNS Server لمعرفة اسم ال Host لرقم IP أو العكس ,, مثلا اذا كان ال IP هو فان ال HOST سيكون www.microsoft.com ,,

4)عمل برنامج Client/Server بسيط ,, chating مثلا ,, كالذي كتبه chik سابقا ,,

هذا للمرحلة الاولى حتى ندخل في الامور الاخرى لاحقا ,,

لكن في نظري لو كتبنا البرامج بداية لل Console دون Win32 Api ,, ثم كتبنا فئة لكل برنامج مثلا ,, بعدها يمكن أن ندخ في ال Win32 Api ,, لأنها قد تعقد الكثيرين في البداية ,, فما رأيكم !!

,,,,,,,,,,,,,,,,,,,,,,,

بالنسبة للكتاب ,, فهو كتيب مجرد طرق استخدام سريعة للدوال المهمة ,, يمكنك تصفحه حتى صفحة 20 ,, به أمور تخص الاساسيات ,,

يوجد لدي كتاب شبكات اخر سأرفقه قريبا ,,

,,,,,,,,,,,,,,,,,,,,

اقتباس
4- هل لازم أسوي include لـ wsock32.lib كل ما عملت برنامج جديد؟

نعم ,, لأن كل برنامج سنكتبه سيرتبط بمكتبة winsock.dll ,, والحمد لله أن winsoc32.LIB موجودة ,, ولولا وجودها لرتبطنا بشكل ديناميكي بال Winsock.dll ,, :)

,,,,,,,,,,,,,,,,,,,

اقتباس
أخيراً في المستقبل لو في أي تحميل مطلوب سواءاً للشبكات أو الـDirectX نتمنى تعطينا لنك التحميل حتى ما نأخرك في الدروس

ولايهمك ,,

وأرجو أن تبحثو معي ,, ممكن أي واحد يجد موقع لابأس به به أمثله أو موارد مهمة فليتحفنا بها ,,

,,,,,,,,,,,,,,,,,,

أخيرا هل البرامج أعلاه صالحة ,, وماذا نفعل في رأيكم ,,؟

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#10

السلام عليكم,

في نضري وحسب طريقتي التي أعمل بها وأعمل بها دائما وهي أحدد شيئا أريد أن أصل إليه وأقوم بالمحاولات.طبعا في الأول تنقص المفاهيم فنقوم بالبحث عنها وفي الأول نبدأ ببرنامج بسيط ولا نهتم بشكله أو مشاكل Optimization فالأول نريد منه فقط أن يشتغل ومن بعد نحاول فهو الأمور أكثر والتعمق فيها ونعيد كتابة البرنامج بطريقة أحسن في كل مرة.

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

أما قضية التعرف على الأيبي فستكون متشابهة لما سبق وأما أمثلة whois فلا أرى شخصيا كيف يمكن أن نعملها ونحن لا نتوفر على قهعدة المعطيات لهده الأمور لأن حسب علمي قد تكون الطريقة الوحيدة لدلك.

فما هي اقتراحات باقي الإخوة والأخوات.

إلى اللقاء.

#11

السلام عليكم ,,

تمام chik ,, كما قلت طريقتك ممتازة في التعلم ,, أن تجعل المثال يعمل أولا ثم تقوم بتشريحه ,, حسنا يمكن أن نتبنى ال Client/Server من البداية ,, لأنه فعلا يعلمنا الكثير من الامور ,, لكن يجب أن نكتب البرنامج صاحب أقل عدد أسطر ممكن على الاطلاق ,, لكي يكون سهلا للجميع ,, ونريده أن يكون على الدوز ,, بحيث يتم تشغيل البرنامجين واحد في جهاز والاخر في جهاز اخر ,,ويمكن أن يكون الاثنان في جهاز واحد وسيعمل باذن الله ,,

بالطبع بعد أن ننتهي سنجرب المثال سويا ,, وهنا أقترح أن يتم الاتفاق بين كل عضوين مثلا ,, واحد ينزل برنامج ال Client والاخر ينزل السيرفر ,, ويتحدثان مع بعضهما عن طريق شبكة الانترنت طبعا !! برنامج chat صناعة محلية ,, حتى نتأكد من عمل البرنامج بالشكل المطلوب ,, وكما ذكرت يمكن بالطبع أن تقوم بعمل chat مع نفسك !! بأن تشغل البرنامجين في جهاز واحد ,,

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

وكما قلت أنت chik ,, توجد أمور لم أعرفها حتى الان ,, لكن باذن الله بالمجهود الجماعي تنحل العقبات ,, فأمر ال WhoIs لم استعمله حتى الان , الا من قبل برنامج جاهز !! لكني مطمئن من هذه الناحية ,, والسبب في ذلك وجود كود لبرنامج مشابهه في CodeProject ,, سنقوم بتشريحه لكن في وقته باذن الله ,,

أخيرا أرجو منكم جميعا طرح الكثيير من الاسئلة ,, أي سؤال مهما كان ومن أي نوع ,,فقط نرجو أن يفهم الجميع الموضوع بالشكل المناسب ,,

بارك الله فيكم ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#12

السلام عليكم ...

دائما انا متأخرة في المشاركة ( و تفوتني الفاكهة في وقتها ..) :)

الاخوة HGB ، chik .. و جميع المشاركين في التعليم الجماعي .. تحية طيبة ..

ارفق لكم ( مع كل الاسف ) باقة من الاسئلة و التعليقات على ما مضى .. و ارجوا ان الاقي صدى جيد عندكم ...

--------

1/ كيف تتم اضافة الملف الرأسي winsock.h الى ++Cالاصدارة ( Borland C++ 5.02 ) ؟

(لقد قمت بعمل نسخ/لصق للملف الى داخل المجلدات BIN و LIB هل هذا صحيح ؟)

--------

2/ ( سؤال غبي لطالما اسأله ... ) ما هو الفرق بين الملفات الرأسية Header File و المكتبات Libary الا تحوي جميعها على دوال جاهزة ؟؟؟؟ ...

و كيف يتم تضمين المكتبة wsock32.LIB في Borland C++ 5.02 هل يتم ذلك برمجياً فقط عن طريق الامر التالي :

#pragma commment(lib, "wsock32.lib")

---------

3/

اقتباس
الدالة التي تبتدأ لنا خدمات ال winsocket هي :

WSAStartup(wVersionRequested, &wsaData);

ما تقوم به فعلياً هذه الدالة هو ان تسمح للبرنامج بتحديد رقم الاصدارة Version الخاص بالـ Windows Sockets API المطلوب ،، و منثما تعيد تفاصيل هذه الاصدارة ،، اعتقد من اجل التعامل معها ..

سؤالي : لاحقاً عند كتابة البرنامج هل سيكون الامر :

WORD wVersionRequested = MAKEWORD(1,1);

بل عملية استدعاء الدالة WSAStartup او بعدها ... ( سؤال غبي .. ها ) ؟

-------

4/

اقتباس
من الملاحظ أن النوع WORD هو 2 بايت أي أنه تماما مثل ال short ,, لكن يفضل لأن نتعامل مع WORD ,,

سؤالي : هل المقصود بالـباراميتر الثاني هو wsaData& ..و كيف سيكون نوع المعلومات التي سيستقبلها؟

---------

5/

اقتباس
ومن يعرف مواقع أخرى فليتحفنا ,,

اليكم هذا الوقع .. الذي اعتقد انه تحفة ..

http://www.planet-source-code.com

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

----------

6/

اقتباس
البرامج :

1) معرفة ال IP الخاص بمستخدم معين ,,

2) عمل scan للمنافذ ومعرفة المفتوح منها ,,

3) الاستعلام من DNS Server لمعرفة اسم ال Host لرقم IP أو العكس ,, مثلا اذا كان ال IP هو فان ال HOST سيكون www.microsoft.com ,,

4)عمل برنامج Client/Server بسيط ,, chating مثلا ,, كالذي كتبه chik سابقا ,,

هذا للمرحلة الاولى حتى ندخل في الامور الاخرى لاحقا ,,

برامج حلوة كبداية ... لكن هل نعتمد على API الآن او لا .. فانا اقول ان دخلنا في الــ Win32 Api لازم يكون الدخول ( بشويش ) بهدوء لأن خلفيتي فيها معدومه !! .. و ان معاكم في اي اختيار تختاره ..

--------

ع جزيل الشكر ... سلفاً ..

و السلام

بنت اليمن ...

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#13

السلام عليكم,

هده بالفعل أسئلة قد يطرحها أي أحد يريد الدخول إلى هدا الميدان.

أولا أريد أن أقول لك أني آسف حيث لا يمكن أن أدلك فيما يخص Borland فقد استعملت نسخة قديمة مند وقت ما ولم أعد له.ولكن يجب أن نعرف أنه لا بد أن تكون هده المكتبات موجودة فيه وربما لا تكون بنفس الإسم.فجربي مثلا اسم Socket أو ما يشابهه.

وأطلب من يتوفر على borland ولقى الحل لهدا أن يعطي تجربته هنا.

وكما هناك أسئلة أخرى عن طريق هده البرمجة وأنا أحاول أن أكتب مثالا مبسطا وسأحاول أن أشرح الأشياء التي أستعملها وكما لاحضت قد تخيفنا بعض الأسماء مثل ما دكرت wsaData ولكن حين نتعرف عليها سنجدها معطيات عادية كالبقية.

على العموم سأحاول أن أعطي المثال في أسرع وقت إن شاء الله.

إلى اللقاء.

#14

السلام عليكم ,,,

أهلين أختي بنت اليمن,, واسف على التأخر في الرد فقط كنت مشغولا قليلا ,,

بالنسبة للأسئلة كما ذكرت نريد الكثير من الاسئلة لنتأكد أن الجميع فهم كل شيء ,, لكن بالطبع بعد اليأس من محاولة ايجاد الحل بشكل فردي ,,

اقتباس
1/ كيف تتم اضافة الملف الرأسي winsock.h الى ++Cالاصدارة ( Borland C++ 5.02 ) ؟

(لقد قمت بعمل نسخ/لصق للملف الى داخل المجلدات BIN و LIB هل هذا صحيح ؟)

لاتحتاجين لاضافة الملفات بشكل فيزيائي الى مجلد برنامجك ,, فقط قومي بعمل # include <winsock.h وستتم اضافة الملف ,, وعندما قلت اضافة لم أقصد الاضافة الفيزيائية ,, أنا أقصد include ,,

( سؤال غبي لطالما اسأله ... ) ما هو الفرق بين الملفات الرأسية Header File و المكتبات Libary الا تحوي جميعها على دوال جاهزة ؟؟؟؟ ...

هذا السؤال كان يحيرني أنا أيضا ,, وليس غبيا مطلقا ,, وكنت أتحير بين ملفات ال .h و ال .lib و .dll ؟؟ لكن الحمد لله عرفت الفروق ,, وهي كالتالي :

ملفات ال .dll و ال lib. أن كليهما يحتويان على الشيفرة المصدرية للدوال التي نستعملها ,, !! لكن لماذا لم تكتب Microsoft أو الجهة المعنية هذه الدوال لملفات cpp لنضمنها في المشروع ؟ الغرض من ذلك بالطبع عدم كشف الكود المصدري للدوال والتي تعتبر أسرار شركات ,, "تودي في داهية ",,

عموما الفرق الحقيقي يبن dll و lib ,,أن dll يمكن لأكثر من برنامج أن يرتبط بها ربطا ديناميكيا ,, دون تضمينها في المشروع مثل ال lib ,, أما lib فيتم تضمينها في ملف ال exe ,,

ويوجد تفصيل أكثر في ذلك ,, أما ملفات ال h. فهي فقط تحتوي على تصريحات الدوال المعرفة في ملفات lib. وdll. ,, تمام :)

اقتباس
و كيف يتم تضمين المكتبة wsock32.LIB في Borland C++ 5.02 هل يتم ذلك برمجياً فقط عن طريق الامر التالي :

#pragma commment(lib, "wsock32.lib")

الطريقة التي ذكرتها تعمل لمصرفي الفيجوال وال Borland وللفيجوال طريقة أخرى كما ذكرت أنا سابقا ,, ليس لدي خبرة في ال Borland لكن سأبحث لكي ,, عموما طريقتك رائعة وأسرع من أي طريقة أخرى مهما كانت ,,وكما ذكر أخي chik قد يكون اسم المكتبة مختلف بالنسبة لمصرف الBorland ,, لكن اذا حدث هذا فعلا ,, لكن لاأعتقد ذلك ,,

اقتباس
سؤالي : لاحقاً عند كتابة البرنامج هل سيكون الامر :

WORD wVersionRequested = MAKEWORD(1,1);

بل عملية استدعاء الدالة WSAStartup او بعدها ... ( سؤال غبي .. ها ) ؟

بالطبع قبل :) و واذا أردنا "ربما لاحقا " استخدام النسخة الثانية من winsocket سنجعلها ,,

WORD wVersionRequested = MAKEWORD(2,2);

اقتباس
سؤالي : هل المقصود بالـباراميتر الثاني هو wsaData& ..و كيف سيكون نوع المعلومات التي سيستقبلها؟

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

اقتباس
wsaData.wVersion
اقتباس
لكن هل نعتمد على API الآن او لا

الدوال التي نستدعيها في الشبكات هي ال API لحسن الحظ !! ولاتوجد api أخرى نريدها ,, سوى برمجة الواجهات والأطر والنوافذ !! لكن ربما ندخل اليها لاحقا ,,

وبارك الله فيكي على الموقع ,, فعلا كنز ,,

بالتوفيق ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#16

السلام عليكم,

سأقترح عليكم هنا مثالا لبرنامج server والآخر Client ببرمجة الكونسول ختى نرى الخطوات التي يجب أن نمر بها لهدا الغرض.وهده الخطوات تبقى صالحة في كل الحالات ويمكن أن نستعملها في جميع أنواع هده البرمجة.مع ملحوضة أني وجدت أن برمجتها على الكنسول أصعب من برمجتها على الوندوز فهده الأخيرة يمكن أن تعطينا ضمنيا الثريدات اللازمة ولكن هنا يجب ان نشغلها نحن وعلى كل حال أنا لم أستعملها هنا حيث أتوقع أنها ربما قد تخيف البعض ولم أستعمل إلا الأدوات الأساسية مثل while وطبعا دوال api الخاصة بالشبكات.

قبل أن أبدأ أريد إعطاء بعض المفاهيم فيما يخص هدا:

في ميدان الشبكات من هدا النوع يكون فيه برنامجين واحد يسمى server.

الدور الدي يقوم به السيرفر هو فتح بوابة port للإتصال وهده البوابة هي رقم من 0 إلى حوالي 65000 ومنها ما هو خاص مثل البوابة رقم 80 تستعمل للويب http الرقم 21 للبروتوكول ftp وغيرها وهناك أرقام يمكن استعمالها لأغراض شخصية.فقلنا حين يفتح البوابة يبقى في الإستماع حتى يتصل به الكلاينت ويتم الإتصال بينهما إد داك يمكن أن يتحاورا أو تبديل الملفات أو إرسال تعليمات أو تشغيل برامج إلى غير دلك. هدا من جهة السيرفر أما من جهة الكلاينت فهو سيقوم أو يحاول ربط الأتصال بالكمبيوتر الدي يوجد عليه السيرفر ودلك من خلال رقم IP لدلك الكمبيوتر ويحاول الإتصال بالسيرفر على البوابة التي يكون قد فتحها السيرفر.

من جهة السيرفر يجب تحديد البوابة لأنه سيأخد ضمنيا IP للكمبيوتر الدي يشتغل فيه.

الكلاينت يجب أن يحدد IP الدي يوجد فيه السيرفر وكدلك رقم البوابة.

والحديث بين الكمبيوترين سيتم بواسطة ما يسمى ب Socket وهي يمكن أن نقول أنها بمثابة قناة التواصل بينهما.

والطريقة لبرمجة السيرفر ستكون حسب الخطواة التالية:

نستدعي في البداية وقبل البدء في تشغيل الإتصال بالدالة

WSAStartup(0x101,&wsd)

وهده تعلم أننا سنشغل السوكيت أو الإتصال وهده ستقوم بتحميل DLL الخاصة بدلك إلى مجال البرنامج وهي تحتوي على 2 بارامتر.

الأول وقد نستعمل 0x101 وهو يعني النسخة ل winsocket التي نريدها وتكون رقم النسخة الكبير والصغير كل منهما في word واحد في البايت العالي والآخر في السفلي وحين نكتب 0x101 سنضع 1 في البايت الأعلى و 1 في الأسفل.

البارامتر الثاني struct من نوع WSADATA ونعطي هنا مؤشر له والدي ستملئه لنا الدالة وفي غالب الأحيان يكون توضيحات على ما سنستعمل مثلا نسخة السوكيت المتوفرة وغيرها ومباشرة بعض استدعاء هده الدالة يمكن أن نشاهد محتويات هده struct حتى نتأكد مما قلت.وقد وضعتها في البرنامج على شكل ملاحضات وفي غالب الأحيان لا تهمنا.

الخطوة الثانية:

تعريف أو تحديد السوكيت مثل soc=socket(AF_INET,SOCK_STREAM,0)

وهدا يعني أننا سنستعمل السوكيت التي تحمل الإسم soc وسنستعمل البروتوكول TCP/IP وربما نكتفي في البداية بهدا البروتوكول لأنه فيه نوع من الأمان الكبير من جهة ضياع المعطيات.

بعد هدا سنعطي الخصائص مثل IP والبوابة في struct من نوع SOCKADDR_IN وفي السيرفر لن نحتاج إلى IP فإدن سنكتب ما يلي:

socin.sin_family=AF_INET نحدد العائلة للسوكيت أننا سنستعمل TCP

socin.sin_port=htons((u_short)12345)

أعطي البوابة التي اخترتها هنا رقم 12345 ويمكن أن نختار أي رقم آخر ونزيده الدالة htons الدي سيحول الرقم إلى رقم تفهمه الستراكت

بعد هدا نستعمل الدالة التالية

bind(soc,(SOCKADDR*)&socin,sizeof(socin))

وهنا الكثير لا يرى ما هي صلاحيتها .وأقول أنه من قبل خلقنا socket كما سميناها soc من جهة وهده الأخيرة لم نعطيها أي معلومات من المعلومات التي يحتاجها السيرفر.

ومن جهة أخرى خلقنا struct من نوع SOCKADDR_IN وهده هي التي تحتوي على المعلومات وإدن فإن هده الدالة ستعمل إن صح القول المزج بينهما وبد دلك ستكون السوكيت تحتوي على المعلومات بدورها.وهده يمكن أن نستعملها في السيرفر فقط وسنرى أنه ليس لها داع في الكلاينت.

وبعد كل هدا نترك السيرفر ليستمع إلى التواصل باستدعاء الدالة

listen(soc,SOMAXCONN) أضن أنه ليس هناك ما يمكن إضافته فقط أن SOMAXCONN هو رقم يدل بشكل عام عن كيفية الإنتضار الدي سينتضره السيرفر وهدا الرقم يمكن أن نختاره نحن أن نأخد القيمة المعطاة من قبل وهي قيمة مدروسة تعطي نتيجة يقال أنها الأحسن.

إدن نترك السيرفر رهن الإستماع ولكن مادا سيحدث إدا وقع اتصال.وهنا أريد أن أضيف أنه من جانب السيرفر يجب أن نتوفر على 2 sochet على الأقل الأولى كما سبق ستكون عامة وهي تخص السيرفر ككل ولكن يجب أن نضيف socket جديدة عند كل اتصال وهده الأخيرة هي التي سيتم عبرها التحاور أو الإتصال الحقيقي .فإدن يجب أن نهيء socket جديد وسنقوم كما سبق ونستعمل هنا الدالة accept وهدا يعني أن هنا اتصال بالسيرفر وسنخلق socket جديدة اسمها مثلا soc2 وهي ستكون قناة الإتصال بهدا الكمبيوتر وإدا أردنا اتصال آخر نخلق socket أخرى ويمكن للسيرفر التحاور مع عدة كلاينت كل واحد عن طريق socket الدي يكون خلقها له أثناء الإتصال.ونحن هنا سنكتفي بواحدة لكن الطريقة تبقى كما هي فسنكتب:

int sz=sizeof(socin2);

soc2=accept(soc,(SOCKADDR*)&socin2,(int *)&sz)

إدا تم الإتصال كما يجب فستكون soc2 معرفة

بعد هدا يمكن أن نرسل كلمة ما إلى الكلاينت باستعمال send كما يلي:

send(soc2,TextToSend,LengthOfText,Param)

بدون تعليق لإلا البارام فهو يعني كيفية الإرسال ورقم 0 يعطي ما نريده هنا.

أما من جهة الإستقبال فيجب أن نعرف أولا هل لا زال شيء ما لم نستقبله إد يمكن أن تتجزء الرسالة إلى أجزاء.ولمعرفة هدا نستعمل

ioctlsocket(soc2,FIONREAD,&cmd)

FIONREAD هو بارامتر يعني مادا نريده وهنا نريد القراءة و &cmd ليس إلا مؤشر عن رقم ستضع فيه الدالة كم عندنا من بايت في الرسالة.

إدا كانت هناك أشياء موجودة نستقبلها في BUFFER كما يلي :

recv(soc2,BUFFER,LengthOfBuffer,FLAG)

وتكون عندنا الرسالة في buffer وما على الرسول إلا البلاغ فافعل برسالتك ما تريد.

حين ننتهي نغلق السوكيت ونقوم بأشغال التنقية:

closesocket(soc2);

closesocket(soc)

WSACleanup()

هدا من ناحية السيرفر ومن ناحية الكلاينت فأنا في الحقيقة تعبت من الكتابة الآن وسأدرجها في المرة القادمة إن شاء الله ولكن هي نفس الأساس فإدا رأينا الكود نتأكد من دلك.

لتشغيل الأمثلة يجب إعادة كتابة IP الدي نريده ونعيد بناء البرنامج في الكلاينت فقط.فأنا اخترت الإيبي 127.0.0.1 وهدا يعني الكمبيوتر الحالي .

نشغل السيرفر وبعد هدا نشغل الكلاينت وحين يتم الإتصال سيرسل السيرفر رسالة للكلاينت وهدا من دوره يرسل رسالة إلى السيرفر.

إلى اللقاء إن شاء الله.

Sample.zip

#17

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

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

سؤالي قديم شوي .. عن مثال ال ping المطروح و هو سؤال شبكي أكثر منه برمجي :

ال api التي نستخدمها أين تقع من طبقات البروتوكول tcp/ip أو من أين تتكلم ؟؟ (طبقات tcp/ip هي application, network, data link, physical ) علما أن كل طبقة (عدا physical) تضيف header خاص بها

الفكره من السؤال أنه كيف العنوان الهدف عم يتعرف على الرسالة أنها طلب echo ؟ الجواب أنه نحن من جعل الرسالة طلب echo بالسطر التالي :

echoReq.icmpHdr.Type = ICMP_ECHOREQ;

أي أننا قمنا بتغليف الرسالة ب ICMP header و لم يقوم أحد بعدنا بتغليف الرسالة بأي header (على الأقل network header) و لكن هناك headers أخرى يجب أن تضاف كالذي يضاف في data link layer و هذا يعني أن السوكيت تقوم على الأقل بتغليف من تحت طبقة network فهل هذا يعني أن ال api's التي نستخدمها هي تتكلم من طبقة network ؟ هل هذا صحيح أم أنه تخريف و استنتاجات خرافية ؟ :D

أعلم أنه كان الأفضل طرح هكذا سؤال في منتدى الشبكات و لكن قلبي ارتحلكم و انتو فيكم اليركة ان شاء الله

شكرا سلفا

السلام عليكم

تم تعديل هذه المشاركة بواسطة PerfectStranger في 21 ديسمبر 2003 في 08:24

#18

السلام عليكم ...

الاخ الــكريم HGB :

بالنسبة لعملية تضمين الملف الرأسي winsock.h فلقد تمت معي بشكل جيد كما اشرت ( :) )... يبدو ان المشكلة اني كنت اتعامل مسبقاً مع الملف socket.h او sys/socket.h و الذي لا تدعمه الاصداره التي اتعامل بها ...

بالنسب للفروق بين الملفات dll,.lib,.h فانا فعلاً اشكرك على هذه المعلومة .. جزاك الله عني خير الجزاء ...

الاخ الــكريم chik :

واووووووو ... كلام وزنه ذهب .. و مُركز حول المعلومات التي اريدها ... في الحقيقة لازلت استرجع انفاسي و حينما استردها فسوف ترى مني العديد من الاسئلة (المزعجة) ...

رجائي فقط ان تكتب لنا الاسطر البرمجية على الهيئة CODE ..

فعلاً اشكــــــرك ... و جزاك الله عني خير الجزاء

و السلام ..،،،

بنت اليمن ..

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#19

السلام عليكم ,,

بارك الله فيك أخي PerfectStranger ,, مايحدث هنا هو كالتالي :

نبدأ من الphiscal ,, وكما ذكرت لايوجد شيء لتغليفه فهذا هو كرت الشبكة أو جهاز الشبكة أيا كان نوعه ,, لاأعرف ماذا يحدث في ال Data Link ,, ثم ال netowrk يغلف بها ال Header مثلا Ethernet ,, ثم ال Transport مثلا ال IP ,, ثم UDP ثم HTTP ,,

الامر الذي لست متأكدا منه هو هل يتم تغليف ال Ethernet في ال NetWork Layer ,, أم ال Phiscal Layer ,,

فحسب الكلام الاول أول شيء يتم تغليفه هو من ال NetWork على حسب علمي ,, لكن اذا وجد شيء ما يغلف من ال DataLink , فأعتقد أن هناك أمر آخر لم نسمع به ,,

أعلم أنني لم أفدك بشيء ,, لكن ربما نتأكد من ذلك لاحقا ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,و

أختي بنت اليمن بالنسبة للمكتبة sys/socket.h ,, فهي خاصة بنظام التشغيل لينكس ,,

والحمد لله أن المشكلة تم حلها ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

أخي chik البرنامج أكثر من رائع ,, ويعمل بشكل ممتاز ,, وشرحك أروع بارك الله فيك ,,

ولدي كتاب شبكات الخاص ب Microsoft ,, سأضيفه قريبا وحجمه 2 ميجابايت,,

وسأعود بعد قليل ,, لنرى ماذا سيحدث بعد ذلك,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#20

السلام عليكم,

إلى الأخت بنت اليمن :

هو فعلا كم من مرة أقول أنه يجب علي أن أكتب الأشياء كما يلزم ولكن الله غالب أنا والنضام أو التنظيم شيئان .ولكن سأعد وأتمنى أن أفيد بوعدي ورغم أني قضير الداكرة أن أعمل بما قلتي وعلى العموم فإن الكود مكتوب كاملا في الملف المرفق.

إلى الأخ Perfect Stranger :

أضن أنه في غالب الأحيان عندما نتعامل مع API فنحن نتعامل في مستوى High Level وقد لا نضع هده الأسئلة حيث أنها ستقوم باللازم. وفيما يخص هدا الموضوع لا أريد أن أقول الآن أشياء لست متأكد منها مية مية لأني في الحقيقة نسيت من يغلف من ولكن سأضع هنا قريبا إن شاء الله رسما مبيانيا يعبر عن كل هده الحالات وقد عثرت عليه مند وقت وأتمنى أن يكون لا زال عندي.

وهل الكل لازال متفقا على المشروع الجماعي.

إلى اللقاء.

#21

السلام عليكم ,,

اقتباس
وهل الكل لازال متفقا على المشروع الجماعي

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

وبالنسبة لبقية الاعضاء فأغلبهم متحمس لهذا المشروع ,, ومنهم من كان مرتبط ببعض المشاريع في الجامعة مثل بنت اليمن ,,و CompuM4n ,, لذا أرجو أن نستمر ,, لنثري النقاش .

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

من هنا سننتظر الاسئلة لليومين التاليين ,, حتى نبدأ بالمثال التالي ,,

وللفهم الاقصى ,, يمكن للأعضاء محاولة كتابة المشروع بأكمله من الصفر ,, للتدريب فقط ,, والتأكد من اتقان هذه الامور ,,

أمر آخر سنحاول تحسين البرنامج ,, لجعله على شكل برنامج chat حقيقي ,, لكن الاهم من كل ذلك ,, تغليف البرنامج في class ليسهل استخدامه لاحقا ,, ويمكن أن أقوم بهذه المهمة ,,

والسبب في ذلك أننا نريد ان نتجه في برمجة الشبكات ونتدرج حتى الوصول الى برنامج File Sharing الذي تحدثنا عنه في بداية الامر(: مع أنه ليس صعبا ") ,, لأن فكرة هذا البرنامج رائعة فعلا ,, ولو عممناها على المنتدى سيكون تقاسم ومشاركة الملفات أسهل بكثيير من ماهو عليه الان ,, قد تكون فوائد البرنامج تحتاج لبعض الدراسة ,, لكن مالذي يضير ؟

عموما يمكن الاستفادة من class ال chat الذي نريد تغليفه هنا في أي برنامج آخر ,,

لكن هذا بعد أن نفهم المثال أولا ,, وهو أمر فرعي ليس له علاقة ,, بالتعلم الجماعي ,,

بانتظار أسئلتكم ,, حتى نمضي قدما ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#22

السلام عليكم

الشكر الجزيل لكم اخوتي HGB , chik و الله يعطيكم العافية

اخي HGB ال ethernet تغلف على مستوى ال data link و غالب الظن أنا اتفق مع ما قال أخي chik أن ال api عالية المستوى و لكن الذي يحيرني إذا كانت ال api عالية المستوى كيف ارفقنا رسالة ال ping ب ICMP header و وضعنا حقل ال type بأنه echo request ؟ و هذا نوع من التغليف !

ان شاء الله استطيع أن اشارككم في المشروع الجماعي بعد انتهاء امتحاناتي (ادعولنا يا جماعة)

السلام عليكم

#23

السلام عليكم.

إلى الأخ PerfectStranger أولا أتمنى لك التوفيق في امتحاناتك حتى تشاركنا وأنت في منتهى السعادة والسرور.

أريد فقط أت أقول أنه رغم أن API هي عالية المستوى وهي خلقت أساسا هكدا لتسهل البرمجة فهي كما يدل عليها اسمها فهي واجهة إد ستكون كمثال قنطرة بين المستوى العالي والمستوى السفلي.ولنعرف أن السيستم كيفما كان نوعه وفي جميع ميادين البرمجة لا بد وأن يترك بوابات للتعامل مع API أو مع برامج العالية المستوى التي تتمكن من اختراق هده البوابات.

فيمكن مثلا بعد أن ننهي مشروعنا هدا بإدن الله أن نبدأ بمشروع نشتغل فيه على المستوى الأسفل كمثل البرامج التي تخطف أو تلتقي كل ما يدخل أو يخرج من الكمبيوتر قبل أن يتلقاها المستعمل.كمثل يمكن أن نعمل نوع من Hook مباشرة على الدفايس الخاص بالسوكيت.

أتمنى التوفيق لجميع الإخوان والأخوات الدين شغالين في امتحاناتهم وإلى اللقاء في فرصة أخرى إن شاء الله.

#24

السلام عليكم ,,,

أخي PerfectStranger :

كما ذكرت فان تغليف Data Link يعتمد على Phiscal Layer ,, وبعض الامور الاخرى ,, مثلا في الغالب سنقوم بتغليف Data Link بطبقة ISDN لو كنا نستخدم ال ISDN في ال Phiscal Layer ,, ويمكن استخدام ال ATM مثلا أيضا ,, أو ال Token Ring ,, اذا كنا نستخدم نوع أسلاك Coaxial cable بدل Twisted-Pair (STP) ,,

لكن تكمن المشكلة هنا لو كان لدينا كرتين شبكة ,, واحد لشبكة Token Ring والاخر شبكة Ethernet عادية ,و والثالث موديم باتصال ISDN ,,وكنا لدينا عنوان 100.200.50.30 متوفر لكل الثلاثة عناوين ,, فأين سيتم ارسال الرسالة !!؟

لأنه لو لم يوجد تحكم على مستوى ال Phiscal Layer وال Data Link ,, ستصبح مشكلة ,,

لكن أعتقد أنه يوجد طرق بالطبع لتلافي ذلك ,, اما الاعتماد على منصة نظام التشغيل ,, أو كتابة خدمات اضافية ,, أو أن يكون التعامل على مستوى ال Socket متاح لل Phiscal And Data Link Layer ,,,

عموما ستكشف لنا الايام هذه الامور ,, بشكل أكبر ,,

ونحن في انتظارك أخي PerfectStranger ,, ووفقك الله في امتحاناتك ,, ولن ننساك من الدعاء :)

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#25

السلام عليكم ....

الاخ chik تحية طيبة ..

فعلاً لقد كان الموضوع الذي طرحته خير معين لي ( بعد الله ) ...

اشكرك جداً جداً ...

ارفق لك مجموعة من الاسئلة ( و قليلٌ من التعليقات )...

على امل ان لا تضع اسمي ضمن قائمة الارهاب ... :)

------------

1-

اقتباس
الدور الدي يقوم به السيرفر هو فتح بوابة port للإتصال

سؤالي : نحن هنا فتحنا اتصال مع البوابة 12345 فهل معنا ذلك ان بقيت البوابات مغلقة (مثلاً البوابة 80 الخاصة بتصفح الويب HTTP عبر السيرفر لا تكون متاحة للـ Client ..؟)

2 - هل من الممكن ان يعرف الـ Server رقم الـ IP Address للـ Client المتصل معه عبر الـ Socket (مثلاً قناة الاتصال soc بين الـ Server و Client ما .. هل يقدر الـ Server ان يعرف الـ IP ذلك الـ Client)؟

3- (تعليق .. )

;(,) WSAStartup تقوم بالحصول على معلومات خاصة بالنسخة الخاصة بالـ Socket التي سوف يتم التعامل معها ،،

و نستطيع الحصول على تلك المعلومات ( اذا اردنا )عبر دوال خاصة مثل ..

GetMaxSocketsAvailable(),GetMajorVersion(),information(),etc

4-

 soc=socket(AF_INET,SOCK_STREAM,0)

ما هو المقصود بالباراميتر 0 صفر ؟

و اريد كذلك التأكد من معلومة ...

Family Address يقصد به نوع التطبيقات التي سوف يتم تبادلها عبر قناة الاتصال Socket ، على سبيل المثال AF_INET يرمز الى التطبيقات المرتبطة بالشبكة ..؟

5- (تعليق ..)

بالنسبة للدالة () htons فهي تعمل على تحويل البيانات العددية الى هيئة يفهما الـ Host و الذي هو هنا الـ Server (ان كان النظام بين السيرفر و الكلاينت مختلف )و لها اشكال عديدة بحسب النوع العددي ..

* htons();-Host to Network Short

* htonl();-Host to Network long

* htons();-Host to Network Short

* htonl();-Host to Network long

6-

bind(soc,(SOCKADDR*)&socin,sizeof(socin));

سؤالي هو لماذا التحويل (SOCKADDR*)&socin ؟؟ اليس socin عبارة عن struct من نوع SOKADD_IN ؟

7- اممممممممممم بعد ان تم بناء الــ Socket ، و اسناد المعلومات الى SOCKADDR_IN ...و كان هذا من اجل تعريف الـ Socket على مستوى برنامج السيرفر .. و عملنا SOCKET ثاني للإتصال بأول كلابنت سوف يتصل .. (soc2) ...

سؤالى : لو اراد Client اخر ( جديد ) الحصول على قناة اتصال جديدة Socket فكيف سيتم التعامل مع ذلك في نفس البرنامج ..؟ ( وضح السؤال ؟؟؟ )

8- 8- لم افهم الباراميترات الخاص بالدالة

ioctlsocket(soc2,FIONREAD,&cmd)

9- ما الذي تقوم به بالضبط الدالة WSACleanup() ... ؟

و اشكرك سلفاً ....

بنت اليمن ..

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

هذا الموضوع مغلق.

مواضيع مشابهة