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

سؤال عن دالة في السي++ ؟؟؟

مغلق
بدأه TAXIDRIVER في 2 نوفمبر 2003 · 7 رد · 1,333 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أريد دالة ( أو برمجة معينة) تقوم بجلب البيانات من ال Buffer ( تتعامل مع البفر ) ؟؟

وبطريقة أخرى : كيف أجلب البيانات من البفر في لغة سي++

وكذلك ..

في الشبكات يكون هناك وسط ناقل بين كمبيوترات الشبكة أنا أريد دالة تقوم بعمل محاكاة لكي أختبر هذا الوسط هل هو مشغول ( فيه بيانات) من قبل مستخدم آخر

أم لا .

ياليت تشوفولي هذا الموضوع .

تحياتي للجميع.

#2

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

ربما لم أفهم سؤالك جيدا لكن أقول في خصوص البافر:

نفترض أنه عندك بافر في الداكرة نقول مثلا في 0x100000 وإدا أردنا أن نقرأ ما فيه يمكن أن نقوم كالتالي:

نعمل مؤشر على البافر مثلا :

DWORD* buff=(DWORD*) 0x100000 ; هنا buff سبؤشر على الداكرة التي فيها المعطيات.

وهنا يمكن أن نقرأ ما في البافر سواء بايت أو 2 أو 4 مرة واحدة.

إدا أردنا بايت نكتب ما يلي:

char* chbuff=(char*)buff نعمل cast على buff

char wanted=*chbuff في wanted ستكون عندنا البايت الموجود في buff

إدا أردنا أن نقرأ WORD نعمل CAST على WXORD كما سبق :

WORD* wdbuff=(WORD*) buff

WORD wanted=*wdbuff

ونفس الشيء بالنسبة ل DWORD .

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

إلى اللقاء

#3

أول شي أحب أشكرك أخوي على تجاوبك وراح أوضحلك المشكلة من بدايتها :

عندنا درس في الشبكات عن بروتوكول csma وطريقة عمله كالتالي:

نفرض عندي كمبيوترات في الشبكة متوصلين بكابل ويمكنهم إرسال البيانات فيما بينهم ... طيب لو أرسل كمبيوتر رسالة على الشبكة وفي نفس الوقت أرسل كمبيوتر آخر رسالة عند ذلك يحدث تصادم Collision .. هذا البروتوكول ينظم عملية الإرسال حيث أنه عندما يريد كمبيوتر أن يرسل فإنه يقوم أولاً بتحسس الكابل( الموصل بين الكمبيوترات ) هل هو مشغول من قبل الآخرين أم فاضي إذا كان فاضي فإنه يرسل البيانات عبره أما إذا كان مشغول فإنه يجرب في وقت آخر.

أنا الآن أقوم بعمل محاكاة لعمل هذا البروتوكول بالبرمجة ( سي++)

وحبيت أسأل عن الشيئين التاليين:

1- كيف أقوم بالبرمجة بعمل محاكاة لتحسس الكابل هل هناك دالة لعمل ذلك أو طريقة معينة في السي++.

2- كيف أجلب البيانات من ال Buffer لكي يقوم الكمبيوتر بإرسالها عبر الخط ( طبعاّ أخوي أنت شرحت لي هذي النقطة بس حاولت أفهمها وماقدرت ياليت أخوي مثال توضيحي أبسط ولو فيه طريقة أخرى غير المؤشرات يكون أحسن لأنها صعبة الفهم.)

فيه سؤال عام : هل هناك دوال في السي تتعامل مع الهاردوير مباشرة كي أستفيد منها أكثر في هذا الموضوع؟؟

وشاكرلك مرة أخرى على تجاوبك مع مشكلتي.

تم تعديل هذه المشاركة بواسطة TAXIDRIVER في 3 نوفمبر 2003 في 22:30

#4

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

وأهلا بك ياأخ TAXIDRIVER .....

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

حيث يمكنك كتابة كود بالأسمبلي داخل السي بلس بلس ...

انظر المثال أدناه ..

int x=10, y= 15;

__asm
{
	mov eax,x
	mov ebx,y
	mov x,ebx
	mov y,eax
}

يمكنك كتابة الكثير من تعليمات الاسمبلي داخل كود للسي بلس بلس ...

وهكذا يمكنك استخام الامرين in , out مع رقم المنفذ الخاص بكابل الشبكة ...

قد يكون سلك شبكة RJ-45 أو LPT او USB أو غيره ... لكن يفترض أن تعرف رقم المنفذ الخاص ولكن كيف لا أعلم أيضا ...

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

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

.....................................

أما بالنسبة لل Buffer فلا تقلق من المصطلح والمقصود به هنا متغير يحمل بيانات فقط لاغير ....

char Buffer [100

الان Buffer المتغير هو ال Buffer الذي تتحدث عنه ....

وبالتوفيق ..

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#5

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

تقول: ( وهكذا يمكنك استخام الامرين in , out مع رقم المنفذ الخاص بكابل الشبكة ... )

ياليت أخوي توضح كيف إستخدام الأمرين في مثال

تحياتي لك.

#6

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

اسمع لي أخي فأنا لا أعرف هدا البروتوكول الدي تتكلم عنه. فإدا كان TCP أو UDP يمكنني مساعدتك.

كما أني لا أعرف كيف يتم التواصل بين الكمبيوترين فإدا كان عبر Serial Port أو Parallel فيمكنك استعمال الدالة في س++ وهي : CreateFile ففي حالة إدا كان الطريق فارغ فهي ستعطيك هاندل شغال وفي الحالة الأخرى تعطيك هاندل لا يشتغل.

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

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

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

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

أتمنى لك التوفيق وسأكون في الخدمة قدر المستطاع وإلى اللقاء.

#7

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

أخ TAXIDRIVER الكود أعلاه فقط لتوضيح طريقة عمل كود الاسمبلي داخل كود السي بلس بلس .. .

وبالنسبة لتعليمتي ال in , out فصيغة عملهما على النحو

الامر in هو المطلوب في حالتنا حيث يتلقى البيانات القادمة اليه من ال منفذ ...

in ax , port_num

والامر out يرسل بيانات الى منفذ معين ....

out port_num , ax

حيث ال port_num هو رقم المنفذ المطلوب و ax هي البيانات المستلمة في الحالة الاولى أو المرسلة في الحالة الثانية ...

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

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

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

وبالنسبة لكلام الاخ chik نرجو ان ترينا العلاقة بين CreateFile وserial Port ان أمكن وجزاك الله خيرا ....

وأخيرا أقول للأخ "سواق التاكسي " بدل وجع الراس ومحاولة تحسس السلك يمكن أن تقوم بكتابة عملية للمزامنة بين الارسال ... ولا تهتم بحدوث التصادم ...

خذ عندك مثال سيوضح ماسأقول ...

في عالم البرتوكولات الشبكية هناك مايدعى بال TTL أو Time To Live ويكون جزء من ال header الخاص بال Packet المرسل أو المستلم ... ويهتم بشأن التصادم بين ال Packets مثلا اذا ارسلت Packet من الجهاز A الى الجهاز B سيكون ضمن معلومات ال Packet خانة تحدد منها كيفية ارسال باقي ال Packets من A ... يعني يخبر B بأن لايرسل أي شيء حتي يستلم مثلا 10 Packets .... وطبعا اذا حدث مكروه للجهاز A ولم يكمل ارسال ال 10 Packets ... فان الجهاز B سيكون "مشمع" حتى تقوم الساعة ... هنا يأتي عمل TTL ويعني ان ال Packet المرسلة اذا لم تصل خلال وقت معين(بالمللي ثواني) سيتم تجاهلها وسيقوم الجهاز B باالارسال فورا دون انتظار A لمدة زمنية اضافية ...

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

نهاية يمكنك القراءة عن برتوكولات ال TCP/IP , UDP , NETBIOS وغيرها ومعرفة طريقة عملها وستساعدك أكثر في انتاج برتوكولك الخاص ....

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#8

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

كما قلت لاستعمال الأبواب السيريال أو البارلال يمكن أن نستعمل API CreateFile لأجل دلك وهاهي الطريقة مثلا لفتح السييال COM1 :

HANDLE hand=CreateFile("COM1",

GENERIC_READ |GENERIC_WRITE,

0,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

NULL);

أتمنى أن تكون الكتابة مقروءة رغم انقلاباتها.هنا ومن أجل فتح باب يجب على البارامتر الخامس أن يكون دائما OPEN-EXISTING والبارامتر الأخير أن يكون NULL أما البقية فيمكن أن نختارها كما نشاء وحسب ما نريد وهده قد تشتغل للكثير إن لم أقل لجميع الحالات وقد لا نحتاج لتغيير أي بارامتر .

هده الدالة ستعطينا Handle شغال إدا لم يقع أي خطء ويجب على السيريال أن لا يكون شغالا من قبل بعد هدا نشتغل بهدل الهاندل كالعادة ويجب غلقه عند النهاية باستعمال :

CloseHandle(hand)

وكما يمكن قراءة وتغيير حال الكوم باستعمال SetCommState أو GetCommState

ويمكن القراءة والكتلبة على الكوم باستعمال API العاديتين WriteFile و ReadFile

وفيما يخص القراءة والكتابة على الأبواب مباشرة باستعمال in أو out فنعلم أن ProtectedMode لا يقبل هدا ولا يقبل الإتصل مباشرة بمختلف الأدوات .ويمكن فعل هدا على برنامج Dos أو باستعمال برمجة VXD إدا كنا على وندوز 98 .

إلى اللقاء.

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

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