القائمة الرئيسية

الصفحات

التعرف على simple server و simple client في بايثون Python الدرس |19|

 

مكتبة socket

درس اليوم هو تكملة للدرس السابق في مكتبة socket بقي منه اجزاء اخيرة قبل الدخول إلى قسم السكيورتي security الخاصة بـ socket.
ليكن لدينا عنوان ايبي طبيعي و نريد تحويله إلى صيغة network, مثلاً اذا اتينا لعمل صورة للداتا في النيت وورك لا نراها بالصيغة الذي نراها طبيعيه, بل نراها بصيغة البايتس و يلزم ان نرجعها لصيغة الادرس لكي نرى الادرس بشكل طبيعي توجد methods تمكننا من هذا.

>>> import socket
>>> ip = "192.168.1.1"         #ايبي طبيعي
>>> ip
'192.168.1.1'
>>> socket.inet_aton(ip)         #تحويل لصيغة تفهمها الشبكة
b'\xc0\xa8\x01\x01'
>>> socket.inet_ntoa(b'\xc0\xa8\x01\x01')        #عملية عكسية للسابقة
'192.168.1.1'
>>>

معنى aton

الـ a من الأدرس يعنيip address.
الـ to  الى.
الـ n تعني الشبكة network.
هذا يفيدنا كثيراً في sniffing .
Screenshot-20200328052400-715x204

buffer size

يعني انه لمعرفة حجم الاستقبال والارسال لدينا
>>> import socket
>>> sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> d_s = sock.getsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF)
>>> d_s
16384
>>> d_r = d_s = sock.getsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF)
>>> d_r
131072
>>>
0

شرح المثال الأسبق

في البداية أنشأنا جلسة بإسم socket و عيننا لها القيم socket.socket و AF ذكرنها بالدرس السابق والذي تعني ipv4.

و d_s يعني default, وعن طريق هذه الميثود getsockopt نعرف اللفل الذي لدينا, اللفل هو socket.SOL_SOCKET هو من لفلات الشبكة, وبعدها وضعنا socket.SO_SNDBUF يعني اعطينا ماهو default send buffer, وبالسطر الذي يليه كتبنا d_s و أعطانا الديفولت وهو 16384.

وبعدها وضعنا d_r يعني الأستقبال, و طلبنا أن يعطينا الأستقبال SO_RCVBUF و اعطانا اياه عند كتابة d_r.
ولتغيير هذه القيم السابقة نستخدم كالتالي

>>> sock.getsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF,1024)
b'\x00@\x00\x00'
>>>  
لا يحتاج إلى شرح فقط اضفنا له القيمة الجديدة في النهاية 1024 و رجع لنا الرقم بشكل تفهمه الشبكة.

simple server & client server

لكي نعمل simple server و simple client يجب علينا ان نعمل اولاً بعض الخطوات المهمة لعمل سرفر وهي :
bind   //معلومات الاتصال يعني السرفر و البورت
listen  //تعني التنصت مع السرفر
accept  //القبول من السرفر
send  //الأرسال
recv  //الأستقبال

مثلا نريد عمل port scanner يجب ان نكون على دراية انه توجد ميثود بسيطة لعمل هذا, مثال
>>> import socket
>>> sock = socket.socket (socket.AF_INET,socket.SOCK_STREAM)
>>> sock.connect_ex(("127.0.0.1",80))
0
>>> sock.connect_ex(("127.0.0.1",21))
10056
الاول هو 0 يعني البورت مفتوح و الثانية 10056 يعني مقفول, اي قيمه غير 0 يعني مقفول.

لنعمل server بسيط حالياً 
import socket
#my server
try:
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(("127.0.0.1",5555))
    s.listen(5)
    client , addr = s.accept()
    print("connection from {0}".format(addr))
except socket.error as e:
    print(e)

استخدمنا الـ exception الاساسي بالبداية وبعدها وضعنا متطلباته الذي ذكرناها قبل قليل bind ووضعنا الاتصال على local لدي و البورت 5555 , و استخدمنا listen للتنصت على الاتصال و بعده القبول accept وقلنا له اي شخص يتصل بالسيرفر يجب ان تطبع لنا الـ addr وقلنا اطبع لنا e اذا حصلت اي مشكلة.

لنعمل client بسيط

ايضاً ( في الـ client لسنا بحاجة لعمل bind ولا listen ولا accept ) نحتاج فقط الاتصال connect.
import socket
#my client
try:
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(("127.0.0.1",5555))
except socket.error as e:
    print(e)
نستخدم حصراً نفس البورت الذي في الـ server وهو 5555 مجرد ما السيرفر رأى client سوف يقول لنا السيرفر انه حصل اتصال.

لنعمل اداة بسيطة لفحص البورتات المفتوحة و المغلقة
import socket
try:
      sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      port_list = [80,21,22,8080,4444,4545,4343,433]
      for p in port_list:
          scanning = sock.connect_ex(("172.217.18.46",p))
          if scanning == 0:
              print("{0}:is open".format(p))
          else:
              print("{0}:is close".format(p))
except socket_error as e:
    print(e)
وضعنا بالأداة فحص البورتات التالية [80,21,22,8080,4444,4545,4343,433] لفحص ايبي موقع جوجل ووضعنا شروط لها اذا كان 0 يكون بورت مفتوح و اي رقم غير الـ 0 يكون بورت مغلق و بالاخير اعطيناه اطبع لنا e اي القيم.
وعند تشغيل هذه الأداة ستكون النتيجة 
80: is open
21: is close
22: is close
8080: is close
4444: is close
4545: is close
4343: is close
433: is close

لتحميل سكربتات الدرس اضغط على الرابط التالي في الصورة تحميل
هل اعجبك الموضوع :

تعليقات

التنقل السريع