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

كيف أحسب عدد الbytes المستقبلة و المرسلة لprocess معينة

بدأه _- محمد نور -_ في 29 ديسمبر 2009 · 12 رد · 2,065 مشاهدة · في برمجة الشبكات والتطبيقات الموزعة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

حياكم الله

أريد حساب عدد الBytes المستقبلة و المرسلة لprocess معينة و ذلك عن طريق معرفة الID الخاص بتلك العملية

يعنى مثلا

يعنى عملية قامت بفتح إتصال ب20 IP و كل IP مفتوح له port خاص به

من خلال هذه المعلومات أرغب فى معرفة كمية الBytes المستقبلة و المرسلة لprocess فى خلال فترة زمنية معينة

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

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#2

يوجد حل يدور فى رأسى

أنا أستطيع أن أحصل على الpackets التى تأتى بها تلك العملية

فهل إذا قمت بالحصول على طول الpacket و قمت بتجميعها كل ثاينة أحصل على الذى أريد !!

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

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#3
اقتباس
فهل إذا قمت بالحصول على طول الpacket و قمت بتجميعها كل ثاينة أحصل على الذى أريد !!

ولكن هذا قد لا يعطي الكميات الحقيقية المرسلة او المستقبلة بواسطه العملية , حيث ان العملية تقوم فقط بعملية وضع للباكت في طابور الارسال , وطبعاً النظام لاحقاً هو الذي يقرر متى سيتم التبادل . قد تكون طريقتك بحاجة الى اضافة شئ اخر مثل hook للكيرنل بحيث يتم الربط لاحقاً بين العملية والباكت المرسل فعلياً ويقوم هذا الـ hook بعمل تنبيه لتطبيقك في حال تم الارسال فعلياً عبر الشبكة ..

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

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

gazabigBanner.jpg

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

#4

ايضاً , الورقه البحثيه التاليه قد تفيدك /

http://www.academypublisher.com/proc/wisa09/papers/wisa09p294.pdf

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

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

gazabigBanner.jpg

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

#5

أنا أرغب بقدر المستطاع بجعل كل شئ من خلال الدوت نت هذه المرة

أنا على فكرة جربت التعامل مع الWinCap و إستطعت الحصول على الذى أتحدث عنه حاليا

و لكن كان هذا من خلال wrapping جاهز حصلت عليه من على الشبكة

أريد أن اعرف كيف أحصل على تفاصيل الpacket من خلال الدوت نت على الأقل ال Header لكى أعرف طول الpacket !

هذا أولا

ثانيا

اقتباس
حيث ان العملية تقوم فقط بعملية وضع للباكت في طابور الارسال , وطبعاً النظام لاحقاً هو الذي يقرر متى سيتم التبادل

أعتقد أن هذا لن يُحدث فارق كبير، أنا لست خبيرا فى مسائل برمجة الشبكات

أرجو أن توضح مثلا على ما تقول لكى أفهم الإنحراف المعيارى :) الذى قد يحدث بسبب هذا الأمر !

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

يريت لو أن أحد يعرف كلامات أكتبها فى جوجل للبحث عن هذ الأمر فليخبرنى بها لكونى كلما بحثت خرج لى نتائج عن المنفذ التسلسلى :lol:

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

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#6

محمد نور أظنه يقصد ال Packets المستلمة لل process , بالتالي نعم إن جمعتها ستحصل على الحجم الحقيقي , لكن إنتبه أن تكون فيها معلومات Layer2 وكل ال headers موجودة كما هي ..

الشيء الآخر , لو كانت مشفرة على مستوى نظام التشغيل ك Ipsec سيتم فك تشفيرها قبل إدخالها لل process الخاص بك .. وأيضا بعض عمليات الضغط كالتي تحدث في RTP headers والتي هي ليست عبارة عن ضغط حقيقي لكن إختصار للمكرر , وعليات ضغط Payload أيضا .. الخ , لكن بشكل عام في الغالب لن يكون هناك فرق , ونادرا مايتم تفعيل الضغط مثلا .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#7
اقتباس

أريد أن اعرف كيف أحصل على تفاصيل الpacket من خلال الدوت نت على الأقل ال Header لكى أعرف طول الpacket !

برمجة الشبكات في .net ليست إلا تغليف للأم Winsock 1 & 2 , وكانت هناك بارامتر في socket options , تقوم بضم بيانات الهدر مع البيانات التي ستقوم بإستلامها ..

الشيء الآخر ستحتاج أن تفعل Option آخر مهمته إقتناص البيانات الداخلة إليك أو لغيرك وإستلامها قبل أن يستلمها ال process المطلوب :) بالتالي تكون حللت المشكلة .

كما قلت هم 2 options يتم تفعيلهم كما كان في winsock الأم , لكن لاأذكر أسمائهم حاليا .

سأدخل بعد قليل وأتذكر قليلا ..

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#8

ماقصدته هو ان العمليات التي تقوم بالارسال والاستقبال معزولة عن تفاصيل الاتصال , فهي تكتفي بإستدعاء system call ما لتكن sendthis() , والذي تضع الباكت بدورها في طابور الارسال وتنسى العملية الباكت بعدها ..

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

اضف كلمة sniffer الى عباره بحثك ..

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

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

gazabigBanner.jpg

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

#9

فهمت كلاك يامحمد معاشر ... لكن عموما بال socket يمكن تنفيذها بشكل عملي ...

@محمد نور : إنظر ل IP_HDRINCL لل setsockopt و SIO_RCVALL لل IOCTL هذه بالنسبة لل WIN32 API ..

هنا مثال قديم بالسي , لشيء لحل مشكلة إستلام كامل الهدر أيضا يستخدم IP_HDRINCL :

/index.php?showtopic=60047

فعل ال 2 options أعلاه وسيكون الموضوع في السليم ..

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#10

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

يعنى أفهم من هذا الكلام أن تجميع أطوال الPackets لن يمثل مشكلة

معذرة يا هيثم لم أفهم الجزء الأخير

اقتباس
الشيء الآخر ستحتاج أن تفعل Option آخر مهمته إقتناص البيانات الداخلة إليك أو لغيرك وإستلامها قبل أن يستلمها ال process المطلوب :) بالتالي تكون حللت المشكلة .

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

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

طيب هناك طلب أخر هاااااااااااام

أنا أريد أن أمنع IP معين من التخاطب مع تلك العملية أو عموما مع التخاطب معى

كيف أفعل هذا

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

سأضرب مثلا

لو أن لدينا Process تتخاطب مع 5 IPs على2 منافذ مختلفة و تقوم بنقل ملفات من و إلى أولاءك الأخرون

هذه العملية تقوم بنقل بيانات من 5 معا و لكن 2 من 5 ينقلون منها بيانات

أنا<--------------1

أنا<--------------2

أنا<------------>3

أنا<--------------4

أنا<------------>5

كيف أمنع خروج تلك البيانات منى، أريد فقط أن يدخل إلى و لا يخرج

ملحوظة أنا أعلم أن هناك Packets تستخدم لتأسيس الإتصال و عمل أشياء أخرى غير نقل البياتات

لذلك فإنه يجب أن يكون منع الPackets دقيقا و إلا حدث خطأ فى نقل البيانات

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

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#11

للتسهيل

بغض النظر عن إذا كان يرسل لى أو أرسل له

كيف أمنع العملية من التخاطب معه !

تم تعديل هذه المشاركة بواسطة _- محمد نور -_ في 1 يناير 2010 في 16:48

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

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#12

محد نور , المشكلة الذي أعرفه لو تم إرسال بينات لمنفذ معين سيكون هناك برنامج آخر يقوم بعمل listen في منفذ معين , فلا تستطيع أن تقوم بعمل Listen أكثر من مرة على نفس المنفذ لنفس كرت الشبكة "يمكن فتح نفس المنفذ على كرت الشبكة الثاني لو وجد وسيتم تمرير البيانات المستلمة لأول كرت شبكة فاتح المنفذ ", فمن سيستلم البيانات القادمة ؟

جرب أن تفتح منفذ مفتوح في الأصل بعد التحقق منه بال Netstat , ستحصل على خطا بقيمة return من الدالة ال Bind قبل عملية Listen مباشرة .. فهذه هي المشكلة هنا .

حتى أننا سابقا كتبنا كود لمسح المنافذ المفتوحة في الجهاز بمحاولة عمل bind لكل المنافذ ولو إستلمنا خطأ يعني أن المنفذ مفتوح فعلا :D

ال RCVALL ستحل هذه المشكلة حيث أنها لاتحتاج للتنصت على منفذ معين فقط , لكن ستحصل على كل ال Packets التي ستصل لنظامك ويقوم برنامجك بالتطفل وقراءة هذه ال Packets قبل أن تصل لل process الحقيقي الذي قام بعمل Listen على المنفذ المطلوب .. بالتالي ستحتاج أن تقرأ في بيانات هدر الباكتات القادمة وتعرف لأي منفذ هي ذاهبة .

لكن إنتبه أن SIO_RCVALL ليست إلا لتقوم بتفعيل ال promiscuous mode في كرت الشبكة ليس إلا , ولو كان كرت الشبكة لايدعم ال promiscuous mode فلن تعمل معك , في لنكس تستطيع تفعيل promiscuous mode من سطر الأوامر

ifconfig eth0 promisc

أيضا لاحظ لهذه التنبيهات من MSDN أيضا :

A socket bound to a specific local interface with the SIO_RCVALL IOCTL will receive only packets passing through that interface. It will not receive packets received on another interface and getting forwarded out on another interface different from the socket bound with SIO_RCVALL IOCTL.

On Windows Server 2008 and earlier, the SIO_RCVALL IOCTL setting would not capture local packets sent out of a network interface. This included packets received on another interface and forwarded out the network interface specified for the SIO_RCVALL IOCTL.

On Windows 7 and Windows Server 2008 R2 , this was changed so that local packets sent out of a network interface are also captured. This includes packets received on another interface and then forwarded out the network interface bound to the socket with SIO_RCVALL IOCTL.

أيضا :

Setting this IOCTL requires Administrator privilege on the local computer.

This feature is sometimes referred to as promiscuous mode. Any direct change from applying this option on one interface and then to another interface with a single call using this IOCTL is not supported . An application must first use this IOCTL to turn off the behavior on the first interface, and then use this IOCTL to enable the behavior on a new interface.

http://msdn.microsoft.com/en-us/library/ee309610%28VS.85%29.aspx

بالنسبة لعمل ال block ل IP معين .. فهذه مشكلة , لأن الباكتات التي ستسلمها ليس إلا نسخة منها ولاأظن أنك لو قمت بتعديلها فسوف تأثر على تلك التي ستسلم للبروسيس المطلوب .

بالتالي هنا تحتاج أن تستخدم device driver ليقوم بعمل الفلترة , يوجد مثال هنا من code project :

http://www.codeproject.com/KB/IP/smfirewall.aspx

بالسي++ والذي يهمك فيه ال device driver الموجود فيه إسمه DrvFltIp.sys , إقرأ كيفية إستخدامه في الكود أعلاه ثم أعد إستخدامه في برنامج , أو إبحث عن DeviceDriver آخر مع كيفية إستخدامه للفلترة , أو إصنع واحد بنفسك , وهنا GamingMaster سيفيدك كثيرا , ولو بقيت على حل ال Device Driver حتى عملية ال sniffing بدل إستخدام SIO_RCVALL إستخدم ال device driver نفسه لأنه سيكون وصل لمرحلة إستلام الباكتات من الهاردوير مباشرة .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#13

:cry: :cry: :cry: :cry: :cry: :cry:

الكلام أصبح مليئ بالطلاسم :calc:

لم أعد أفكر فى عمل Blocking :D

عموما جزاكم الله خيرا كثيرا

سوف أحاول مع موضوع الDeviceDriver و أتمنى أن أفهم الذى سوف يأتى فيما بعد :huh:

تم تعديل هذه المشاركة بواسطة _- محمد نور -_ في 1 يناير 2010 في 23:48

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

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

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